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)

浙公网安备 33010602011771号