数组帽被覆盖

时间:2016-04-14 18:27:05

标签: go

GO MASTERs!你能建议吗?

  1. 使用make([] int,len,cap),GO是否允许数组初始化同时进行声明?

    myArray := make([]int, 3, 10){1,2,3}

  2. 在下面的例子中,我看到cap(myArray)已更改为len(myArray)。背后的根本是什么?

  3. <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

2 个答案:

答案 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
相关问题