Go的内置append
函数的复杂性是什么?使用+
进行字符串连接怎么样?
我想通过附加除了该元素之外的两个切片来从切片中删除元素,例如。 http://play.golang.org/p/RIR5fXq-Sf
nums := []int{0, 1, 2, 3, 4, 5, 6, 7}
fmt.Println(append(nums[:4], nums[5:]...))
=> [0 1 2 3 5 6 7]
http://golang.org/pkg/builtin/#append表示如果目的地有足够的容量,则该切片为resliced
。我希望“reslicing”是一个恒定的时间操作。我也希望这同样适用于使用+
的字符串连接。
答案 0 :(得分:21)
这完全取决于所使用的实际实现,但我的基础是标准Go以及gccgo。
<强>片强>
Reslicing意味着更改结构中的整数(切片是一个包含三个字段的结构:长度,容量和指向后备内存的指针)。
如果切片没有足够的容量,追加将需要分配新内存并复制旧内存。对于具有&lt; 1024个元素的切片,它将使容量加倍,对于具有&gt; 1024个元素的切片,它将使其增加1.25倍。
<强>字符串强>
由于字符串是不可变的,因此每个字符串与+
的连接将创建一个新字符串,这意味着复制旧字符串。因此,如果您在循环中进行N次,则将分配N个字符串并将内存复制N次。