Arrays 在Golang重新切片
我最近学习了Go语言,现在我对以下代码感到困惑:Arrays 在Golang重新切片,arrays,slice,Arrays,Slice,我最近学习了Go语言,现在我对以下代码感到困惑: package main import "fmt" func main() { a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[:2] printSlice("c", c) d := c[2:5] printSlice("d", d) } func p
package main
import "fmt"
func main() {
a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[:2]
printSlice("c", c)
d := c[2:5]
printSlice("d", d)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
结果是:
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead
d len=3 cap=3 [0 0 0]
c
是从数组b
中获取的切片。这不是副本,只是b
的前两个元素上的一个窗口
由于b
的容量为5,c
可以扩展到其他3个位置(实际上,它生成一个新的片,但位于内存中的同一位置)
切片的最大容量是基础数组的容量减去切片在数组中的起始位置:
array : [0 0 0 0 0 0 0 0 0 0 0 0]
array : <---- capacity --->
slice : [0 0 0 0]
slice : <---- capacity --->
输出:
c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0]
请注意,在go 1.2()中,可以将其自身的容量(而不是从底层数组推断的容量)关联到一个片
请参阅“”,以及
切片操作通过描述已创建数组或切片的连续部分来创建新切片:
片的容量是片可以容纳的最大元素数,即使在重新选择后也是如此;它反映了基础数组的大小。在本例中,slice变量的容量为8 (基础阵列的容量减去阵列中切片起始位置) 该片有:
- 从0开始的索引
- 长度等于
j-i
- 容量等于
k-i
如果
我感谢你的帮助性回答,那么评估就会恐慌。那么b也会受到影响吗?是的。但是你看不到它,因为长度是0。具有自身容量的切片即将出现(go 1.2)。看见
c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0]
var array [10]int
slice := array[2:4]
array : [0 0 0 0 0 0 0 0 0 0]
array : <---- capacity --->
slice : [0 0]
slice : <-- capacity --> 8 (10-2)
slice = array[2:4:6]
array : [0 0 0 0 0 0 0 0 0 0]
array : <---- capacity ---> 10
slice : [0 0]
slice : <- cap-> 4 (6-2)
a[i : j : k]