2-18 切片
func main() { //定义一个10长度的数组 array := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} //切片:定类型不定长度的,切边是可以动态扩张的。 //从array数组截取切片,含头不含尾,截取到len(array)-1个元素 slice := array[0:10] fmt.Printf("array的类型是%T,array的值是%v\n",array,array) fmt.Printf("slice的类型是%T,slice%v\n",slice,slice) slice = array[0:5] //从0项截取到第4项 fmt.Printf("slice的类型是%T,slice%v\n",slice,slice) slice = array[2:5] //从第二项截取到第4项 fmt.Printf("slice的类型是%T,slice%v\n",slice,slice) slice = array[2:] //从数组的第二项截取到最后 fmt.Printf("slice的类型是%T,slice%v\n",slice,slice) slice = array[:] //全部截取数组中的元素 fmt.Printf("slice的类型是%T,slice%v\n",slice,slice)
//也可以从切片截取接片。 }
执行结果
兼并另外一个切片
slice = []int{1, 2, 3} slice1 := []int{4, 5, 6} for _, vaule := range slice1{ slice = append(slice, vaule) } fmt.Println(slice) //另外一种兼并方法 slice = append(slice, slice1...) fmt.Println(slice)
使用make创建切片
//使用make创建切片,创建一个0长度,0容量的切片。 slice := make([]int, 0, 0) fmt.Printf("slice的值是%d,slice的长度是%d,slice的容量是%d,slice的地址是%p\n", slice, len(slice), cap(slice), &slice) //切片的扩容策略,当容量不够时,容量*2(有时会+2),找到一片新的内存,将原有元素拷贝进去。 for i := 0; i <= 10; i++ { slice = append(slice, i) fmt.Printf("slice的值是%d,slice的长度是%d,slice的容量是%d,slice首元素的地址是%p\n", slice, len(slice), cap(slice), &slice[0]) }
执行结果
切片是一种地址引用
array := [3]int{0,1, 2} slice1 := array[:] slice2 := array[:] fmt.Printf("array的地址是%p,slice1的地址是%p,slice2的地址是%p\n",&array,&slice1,&slice2) //各不相同,使用的是栈内存,地址不会改变 fmt.Printf("array[0]的地址是%p,slice1[0]的地址是%p,slice2[0]的地址是%p\n",&array[0],&slice1[0],&slice2[0]) fmt.Printf("array[1]的地址是%p,slice1[1]的地址是%p,slice2[1]的地址是%p\n",&array,&slice1[1],&slice2[1])
执行结果
修改slice[1],slice[2]
slice1[1] = 11 slice2[2] = 22 fmt.Println(array) fmt.Println(slice1) fmt.Println(slice2)
可以看到数组array的slice的元素也会发生变化。