先看一段slice使用代码:
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} fmt.Println("arr[2:6]=", arr[2:6]) fmt.Println("arr[:6]=", arr[:6]) fmt.Println("arr[2:]=", arr[2:]) fmt.Println("arr[:]=", arr[:])
运行结果:
可以发现,结果输出为数组的左开区间,右闭区间。
二.slice对数组 *** 作func updateSlice(s []int) { //这里[]不加数字代表slice s[0] = 100 } func main() { arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} s1 := arr[2:] s2 := arr[:] fmt.Println("After updateSlice(s1):") updateSlice(s1) fmt.Println(s1) fmt.Println(arr) fmt.Println("After updateSlice(s2):") updateSlice(s2) fmt.Println(s2) fmt.Println(arr) }
结果:
这种 *** 作就非常离谱,淦,和C/C++/Java *** 作都不一样。
原理:(对底层array的一个view)
这里新创建的s1和s2数组其实是对arr地址的映射,修改对应地址内的值,当然也会反射到arr数组上。
s2 := arr[:] s2 = s2[:5] fmt.Println("s2[:5]", s2) s2 = s2[2:] fmt.Println("s2[2:]", s2)
结果:
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} s1 := arr[2:6] s2 := s1[3:5] fmt.Println("s1=", s1) fmt.Println("s2=", s2)
结果:非常出人意料!!!
原理:slice可以向后扩展,不可以向前扩展。
其中ptr是指向的指针,len是长度,cap是向后扩展长度。
s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
下面我们去获取len和cap:
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} s1 := arr[2:6] s2 := s1[3:5] fmt.Println("arr=", arr) fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%dn", s1, len(s1), cap(s1)) fmt.Printf("s2=%v,len(s2)=%d,cap(s2)=%dn", s2, len(s2), cap(s2))
结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)