切片的疑问?
直接看代码
a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s := a[1:3:6]
fmt.Println(s, len(s), cap(s)) // [2 3] 2 5 实际地址包含有 [2, 3, 4, 5, 6]
s2 := s[3:] // 为什么这里报越界错误???按我的理解,这里应该得到 [5, 6] 才对啊
s2 := s[1:] // 这种可以正常执行
fmt.Println(s2, len(s2), cap(s2)) // [3] 1 4 按我的理解,应该得到 [3, 4, 5, 6]
s2 := s[3:5] // 这种也可以执行, 按上面的执行结果来看,这种应该越界了啊
fmt.Println(s2, len(s2), cap(s2)) // [5 6] 2 2
切片的一些特性真是让人莫名其妙啊。
追加
再次测试代码,发现问题的原因:
再次理解:
- 其实 s[3:] 等价于 s[3:len(s)],因为s的长度是2,所以这里溢出了。
- s[1:] 等价于 s[1:len(s)],能取到索引。
- s[3:5] 因为s的容量是5, 实际的索引地址支持到 【2,3,4,5,6】
- 再比如,我也可以取 s[1:5]
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: