Arrays 关于附加内置函数的几个问题
第五个片应该是[9 3 0 1],但它是[9 3 0 2],我每一步都打印结果,我发现第五个片在添加第七个片[9302]时从[9301]变为[9302],我认为它应该与片下的阵列存储有关,但为什么 我认为[问题]与片下的阵列存储有关 是的 但为什么呢Arrays 关于附加内置函数的几个问题,arrays,go,append,Arrays,Go,Append,第五个片应该是[9 3 0 1],但它是[9 3 0 2],我每一步都打印结果,我发现第五个片在添加第七个片[9302]时从[9301]变为[9302],我认为它应该与片下的阵列存储有关,但为什么 我认为[问题]与片下的阵列存储有关 是的 但为什么呢 append功能: 有时会重新使用原始备份阵列,但 有时会创建新的备份数组并将原始值复制到新数组 目前还没有关于它何时做这两件事中的一件的承诺 当它重新使用原始数组时,您会遇到不喜欢的行为。当它生成一个新数组时,您会遇到所需的行为。由于您需要复
append
功能:
- 有时会重新使用原始备份阵列,但
- 有时会创建新的备份数组并将原始值复制到新数组
[[] [9] [9 3] [9 3 0] [9 3 0 2] [9 3 0 1 2] [9 3 0 2] [9 3 1] [9 3 1 2] [9 3 2] [9 0] [9 0 1] [9 0 1 2] [9 0 2] [9 1] [9 1 2] [9 2] [3] [3 0] [3 0 1] [3 0 1 2] [3 0 2] [3 1] [3 1 2] [3 2] [0] [0 1] [0 1 2] [0 2] [1] [1 2] [2]]
与:
功能非共享
定义为:
result = append(result, unshare(preSets))
如果您试图向自己解释得到确切结果的确切原因,这就有点棘手了,因为您没有得到任何关于append
何时生成新的备份数组以及何时重新使用现有备份数组的承诺,但如果您做出以下两个假设,那么这是可以解释的:
append
如果不需要,则从不复制备份数组;及append
进行复制时,它有时会以某种方式过度分配新的备份数组append
的行为或多或少类似于此,当然这一行为特定于[]int
:
func xappend(原始[]整数,添加[]整数)[]整数{
has:=len(原)
需要:=具有+长度(添加)
//如果我们可以将添加的元素放入,现在就这样做。
如果cap(原始)>=需要{
fmt.Println(“就地复制”)
来源=来源[:需要]
副本(原始[已:需要],添加)
返回原点
}
newSize:=undocumentedFunction(has、cap(orig)、needed)
fmt.Println(“新建,尺寸”,新闻大小)
新建:=make([]int,需要,newSize)
副本(新的、原始的)
副本(新[已:需要],添加)
还新
}
func undocumentedFunction(oldCap、oldLen、newCap int)int{
两倍:=oldCap+oldCap
如果newCap>太多{
返回新帽
}
//2倍旧容量就足够了,但是
//我们将以各种方式对此进行调整。
//精确的调整可能随时发生变化。
如果oldLen<1024{
回报很多
}
恐慌(“未复制此部分”)
}
这个“未记录的函数”是运行时系统的一部分,它与编译器协作。您可以看到它的实际代码(注意:此链接可能在某个点中断或转到错误的行)
(示例可运行代码在运动场上。),,等等。附加机制有很好的文档记录。您能澄清这个问题吗?显示的代码非常复杂,很难准确地说出您所询问的append行为。
result = append(result, preSets)
result = append(result, unshare(preSets))
func unshare(a []int) []int {
tmp := make([]int, len(a))
copy(tmp, a)
return tmp
}