GO MASTERs!你能建议吗?
使用make([] int,len,cap),GO是否允许数组初始化同时进行声明?
myArray := make([]int, 3, 10){1,2,3}
在下面的例子中,我看到cap(myArray)已更改为len(myArray)。背后的根本是什么?
<ex>
myArray := make([]int, 3, 10)
myArray = []int{1,2,3}
fmt.Println("len:"len(myArray),", cap:",cap(myArray))
len:3,上限:3
为什么cap(myArray)在声明时是3而不是10?
我直接初始化了单个元素。并且,它按我的意愿工作
<ex>
myArray := make([]int, 3, 10)
myArray[0] = 1
myArray[1] = 2
myArray[2] = 3
fmt.Println("len:"len(myArray),", cap:",cap(myArray))
len:3,上限:10
答案 0 :(得分:2)
我相信你得到的结果是因为在第一个例子中你声明了一个长度为3且上限为10的切片。但是,在下面的语句中,你为该变量分配了一个完全不同的切片。由于切片是使用“composite-literal”语法声明/初始化的,因此它只有3个项目,即初始化的容量。在第二个示例中,为使用make创建的切片的每个索引分配值,保留长度和容量属性。
尝试进一步澄清......在C#或Java或C ++中,这就像做这样的事情;
List<string> myStrings = new List<string>();
myStrings.Add("A string");
myStrings = new List<string>();
正如您可能认为的那样,在为myStrings变量分配新列表后,旧列表将丢失。所以,为了给出简单的答案,你不仅要覆盖上限,而是要覆盖整个片段。您在分配中覆盖它的值会导致创建一个限制为3的切片,这就是您获得该结果的原因。
答案 1 :(得分:2)
所以这里有一些事情在发挥作用。我强烈推荐goblog对此的解释:https://blog.golang.org/slices(请转到标有容量的部分)。此外,只是一小部分语义,但这些实际上是切片,而不是数组:)
为了达到目的,当你第一次宣布切片时,你的len为3,容量为10.没问题。但是你重新声明myArray,并将它设置为[] int {1,2,3}。也没有问题,这是有效的。
当您预期之前的len / cap保持不变时,问题就出现了;你的切片只是一个指向内存中某个空间的指针。所以你现在已经改变了你的底层指针(参见goblog)。切片的容量和长度现在也改变了(到默认值 - 再次,请参阅goblog)。如果要添加更多元素,可以看到相同的len / cap更改:
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