在下面的代码段中,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
}
答案 0 :(得分:1)
答案 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可能有助于循环意义。
因此,该行根本没用,你应该删除它。