切片扩容策略在Go标准编译器1.16中有所变化
上一篇文章Go 1.16/1.17/1.18前瞻中漏掉了一个小变化:切片扩容策略在Go标准编译器1.16中有所变化从而使之更合理化。详见提交:https://github.com/golang/go/commit/2333c6299f340a5f76a73a4fec6db23ffa388e97?branch=2333c6299f340a5f76a73a4fec6db23ffa388e97&diff=unified
换句话说,如果一个append(x, values...)调用需要扩容,则基础切片x的容量将决定结果切片的容量(而不是原来的基础切片x的长度决定结果切片的容量)。
举个例子,下面这个程序使用Go 1.15官方编译器编译将输出2048 1280,但是使用Go 1.16官方编译器编译将输出1280 1280。
package main
func main() {
const N = 1024
var a [N]int
x := append(a[:N-1:N], 0, 9)
y := append(a[:N:N], 9)
println(cap(x), cap(y))
}
本文首发在微信Go 101公众号,欢迎各位转载本文。Go 101公众号将不定期发表一些原创短文,包含Go语言中的事实、细节和技巧等。有意关注者请扫描下面的二维码。
关于更多Go语言编程中的事实、细节和技巧,请访问《Go语言101》官方网站 https://gfw.go101.org (可点击下面的原文链接直接访问)或者项目地址 https://github.com/golang101/golang101。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
因为新开的微信公众号不再支持留言,所以若有问题,可到上述项目中创建一个issue留言交流。
一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一
本书PDF下载地址:https://github.com/golang101/golang101/releases