了解Go中的切片分配

时间:2017-07-11 09:42:28

标签: go

在下面的代码段中,if阻止执行

后的行到底是什么

slice = slice[0:l+len(data)]

func Append(slice, data []byte) []byte {
    l := len(slice)
    if l + len(data) > cap(slice) {  // reallocate
        // Allocate double what's needed, for future growth.
        newSlice := make([]byte, (l+len(data))*2)
        // The copy function is predeclared and works for any slice type.
        copy(newSlice, slice)
        slice = newSlice
    }
    slice = slice[0:l+len(data)]  // <-- What is this doing ?
    for i, c := range data {
        slice[l+i] = c
    }
    return slice
}

3 个答案:

答案 0 :(得分:1)

我想

slice = slice[0:l+len(data)] 

更改slice长度,因此您可以添加新元素。

  

如果切片具有足够的容量,则可以通过重新切片来延长切片的长度。

reference

答案 1 :(得分:0)

只需展开len(slice),这样就可以附加数据,删除这个语句,切片出索引...另外,copy复制min len(src)和len(dst),所以当执行{ {1}},len(切片)为0

答案 2 :(得分:0)

只需发布此答案以供将来参考。

那条线没用。切片的容量由其上方的语句扩展。

        // Allocate double what's needed, for future growth.
        newSlice := make([]byte, (l+len(data))*2)
        // The copy function is predeclared and works for any slice type.
        copy(newSlice, slice)
        slice = newSlice

第一行创建了一个名为“newSlice”的更大片段。
在第二个“切片”中将其内容复制到“newSlice”。
然后,“newSlice”被克隆回“切片”。

是的,Go确实对此事感到奇怪,因为内容也没有复制,但“slice”现在具有与“newSlice”相同的容量。但它不像C中的“指针赋值”,因为我们仍然有两个不同的切片实例,一个发生的事情不会影响另一个。请注意使用赋值运算符“=”而不是短变量声明运算符“:=”,如this answer in SO中所述

实际完成的是将原始“切片”值和“0”分配给“newSlice”额外位置,但这也是一种浪费,因为Go已经将它们初始化为{0“{{ 1}}陈述。

这也是第二次浪费,因为它在“数据”中重新定义了所有这些位置以及其余内容之后的循环。这个link可能有助于循环意义。

因此,该行根本没用,你应该删除它。