Go 切片

切片和数组类似,都可以存储一组数据,但是数组是定长,即声明时就确定了长度,切片支持扩容

切片的声明初始化:

1.声明时就初始化

	//声明方法1
	slice1 := []int{1,2,3,4}
	fmt.Println("slice1",slice1)

2.使用make分配一定的空间,根据需要初始化

注意:只声明一个切片,不分配空间,而直接使用,会导致panic

	//声明方法2
	var slice2 []int
	slice2 = make([]int,4)
	slice2[2] = 3
	fmt.Println("slice2",slice2)

注意:只声明一个切片,不分配空间,而直接使用,会导致panic

	var slice4 []int
	slice4[4] = 1//panic: runtime error: index out of range [4] with length 0

3.可以使用数组赋值

//声明方法3
	var arr [4]int = [...]int{1,2,3,4}//先声明一个数组
	slice3 := arr[1:3]
	fmt.Println("slice3=",slice3)//结果为slice3= [2 3]

  

切片的遍历

	//slice 的遍历
	for idx,v := range slice1{
		fmt.Printf("slice1[%v]=%v\n",idx,v)
	}

  

 

扩展,for range还有一种用法就是

for range 变量{
    //do something
}

用append对切片进行动态追加

	//append用法
	slice4 := make([]int,4)
	slice4 = append(slice4,[]int{1,2,3}...)
	fmt.Println("slice4=",slice4)//输出slice4= [0 0 0 0 1 2 3]

注意append的数据追加到原来的切片数据后面。

append底层操作是,append重新分配一块内存,原先的slice的长度加上append的长度的内存。

append将原先的slice数据拷贝到新的内存地址,然后append的数据追加到后面,之前的内存交由gc处理。

这样看起来就像扩容了一样

 

切片的拷贝

由于切片是引用型数据,不能直接赋值拷贝(这样会使得两个切片引用同一块内存),可以使用copy函数:

	copy(slice4,slice1)//slice1[1 2 3 4]拷贝到slice4[0 0 0 0 1 2 3]
	fmt.Println("slice4=",slice4)//输出:slice4= [1 2 3 4 1 2 3]

 

string和slice

string底层其实是一个byte数组,因此string也可以进行切片操作

	//string和slice
	str := "abcdefghijklmnopqrstuvwxyz"
	str_sli := str[1:4]
	fmt.Printf("str_sli=%v,type=%T\n",str_sli,str_sli)//输出str_sli=bcd,type=string

  

通过切片操作string字符串

	//通过切片操作string字符串
	str_arr := []byte(str)
	str_arr[0] = '1'
	str_arr[1] = '2'
	str_arr[2] = '3'
	str = string(str_arr)
	fmt.Println("str=",str)//输出str= 123defghijklmnopqrstuvwxyz

中文字符串要用rune操作

	//字符串中文操作
	str_zh := "你好,世界"
	str_rune := []rune(str_zh)
	copy(str_rune[3:],[]rune("中国"))
	str_zh = string(str_rune)
	fmt.Println("str_zh=",str_zh)

  

 

 

 

posted @ 2020-04-02 15:45  醉深梦始  阅读(176)  评论(0)    收藏  举报