gpt4 book ai didi

go - 调整 slice 大小-是否检查`len(slice)> 1`或`newCap> 2 * len(slice)`

转载 作者:行者123 更新时间:2023-12-01 22:12:05 27 4
gpt4 key购买 nike

Go Programming Language书中,作者给出了append()函数的以下代码示例,该函数接受[]intint作为参数,并将相应地处理调整大小:

// gopl.io/ch4/append
func appendInt(x []int, y int) []int {
var z []int
zlen := len(x) + 1
if zlen <= cap(x) {
// There is room to grow. Extend the slice.
z = x[:zlen]
} else {
// There is insufficient space. Allocate a new array.
// Grow by doubling, for amortized linear complexity.
zcap := zlen
if zcap < 2*len(x) { // Question: Why not len(x) > 1?
zcap = 2 * len(x)
}
z = make([]int, zlen, zcap)
copy(z, x)
}
z[len(x)] = y
return z
}

为什么最里面的支票写为 if zcap < 2*len(x)而不是等效的 if len(x) > 1
后者对我来说似乎更清楚,并表明了以下意图:如果初始 slice 的长度为0或1,则在添加新元素后,我们不会分配额外的容量。
等效 zcap < 2*len(x)len(x) > 1的详细信息
我们可以看到 zcap的值是从 zlen分配的,它又具有 len(x) + 1的值,因此如果我们布置不等式:

zcap <2 * len(x)

替换 zcap := zlen后,我们得到:

zlen <2 * len(x)

替换 zlen := len(x) + 1后,我们得到:

len(x)+ 1 <2 * len(x)

重新排列后,我们得到:

len(x)> 1

最佳答案

没错,zcap < 2*len(x)等同于len(x) > 1。您可以在此函数中用zcap < 2*len(x)完全替换len(x) > 1
但是根据源code,还有另一个名为appendslice的函数。在此功能中,您无法进行替换。
我认为作者仅使用zcap < 2*len(x)来保持两个功能的一致性。这里的主要目的是避免频繁分配。

关于go - 调整 slice 大小-是否检查`len(slice)> 1`或`newCap> 2 * len(slice)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63006890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com