Array Cap overwritten
走吧,主人!你能提出建议吗?
对于make([]int,len,cap),go是否允许数组初始化同时声明?
在下面的例子中,我看到cap(myarray)已经更改为len(myarray)。背后的根本原因是什么?
江户十一〔一〕号
len:3, cap:3
号
为什么我声明的cap(myarray)是3而不是10?
我直接初始化单个元素。而且,它按我想要的方式工作
埃多克斯1〔2〕
len:3, cap:10
号
所以这里有一些事情要做。我强烈推荐Goblog对此的解释:https://blog.golang.org/slices(请转到标有capacity的部分)。另外,只需要一点点语义,但这些实际上是切片,而不是数组:)
为了达到这一点,当您第一次声明切片时,您的len为3,capacity为10。没问题。但是,然后重新声明myarray,并将其设置为[]int 1,2,3。也没有问题,这是有效的。
当您期望以前的len/cap保持不变时,问题就出现了;您的切片只是指向内存中某些空间的指针。所以现在您已经更改了底层指针(请参见goblog)。切片的容量和长度现在也改变了(变成默认值——同样,参见goblog)。如果要添加更多元素,可以看到len/cap的相同更改:
1 2 3 4 5 6 7 8 | myArray := make([]int, 3, 10) fmt.Println("len:"len(myArray),", cap:",cap(myArray)) // len: 3 cap: 10 myArray := []int{1, 2, 3} fmt.Println("len:", len(myArray),"cap:", cap(myArray)) // len: 3 cap: 3 myArray = append(myArray, 4) fmt.Println("len:", len(myArray),"cap:", cap(myArray)) // len: 4 cap: 8; automatically increases the cap |
号
我相信您得到了这个结果,因为在第一个示例中,您声明了一个长度为3、上限为10的切片。但是,在下面的语句中,您为该变量分配了一个完全不同的切片。由于您分配的切片是使用"composite literal"语法声明/初始化的,并且它只有3个项,也就是它初始化时使用的容量。在第二个示例中,将为使用make创建的切片的每个索引指定值,保留长度和容量属性。
试图给出更多的解释…在C或Java或C++中,这就像是在做这样的事情;
1 2 3 4 | List<string> myStrings = new List<string>(); myStrings.Add("A string"); myStrings = new List<string>(); |
正如您可能假设的那样,在为mystrings变量分配了一个新的列表之后,旧的列表将丢失。所以简单地说,你不仅仅覆盖了帽子,你还覆盖了整片。您的赋值中覆盖它的值会导致创建一个上限为3的切片,这就是您得到该结果的原因。