Go编程语言中这个循环的计算复杂性是多少?
var a []int
for i := 0 ; i < n ; i++ {
a = append(a, i)
}
Run Code Online (Sandbox Code Playgroud)
并append以线性时间(重新分配内存和每个追加拷贝的一切),或在固定的时间里操作(比如在许多语言方式矢量类是implemnted)?
在服务器上运行示例The Go Tour(当前版本为 1.12.7),我发现如果新切片长度大于当前支持数组的长度,则切片的容量会加倍到 2 的下一个幂。
如果我在我的机器上运行相同的程序(Windows 上的版本为 1.10.3),切片容量将更改为下一个 2 的倍数。
为什么它们不同?是因为 Go 版本还是运行时实现?容量变化是确定性的吗?
远程服务器上的输出是这样的
len=0 cap=0 []
len=1 cap=2 [0]
len=2 cap=2 [0 1]
len=5 cap=8 [0 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)
本地机器上的输出是这样的
len=0 cap=0 []
len=1 cap=1 [0]
len=2 cap=2 [0 1]
len=5 cap=6 [0 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)
这是参考代码
package main
import "fmt"
func main() {
var s []int
printSlice(s)
// append works on nil slices.
s = append(s, 0)
printSlice(s)
// The slice grows as …Run Code Online (Sandbox Code Playgroud)