Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 关于附加内置函数的几个问题_Arrays_Go_Append - Fatal编程技术网

Arrays 关于附加内置函数的几个问题

Arrays 关于附加内置函数的几个问题,arrays,go,append,Arrays,Go,Append,第五个片应该是[9 3 0 1],但它是[9 3 0 2],我每一步都打印结果,我发现第五个片在添加第七个片[9302]时从[9301]变为[9302],我认为它应该与片下的阵列存储有关,但为什么 我认为[问题]与片下的阵列存储有关 是的 但为什么呢 append功能: 有时会重新使用原始备份阵列,但 有时会创建新的备份数组并将原始值复制到新数组 目前还没有关于它何时做这两件事中的一件的承诺 当它重新使用原始数组时,您会遇到不喜欢的行为。当它生成一个新数组时,您会遇到所需的行为。由于您需要复

第五个片应该是[9 3 0 1],但它是[9 3 0 2],我每一步都打印结果,我发现第五个片在添加第七个片[9302]时从[9301]变为[9302],我认为它应该与片下的阵列存储有关,但为什么

我认为[问题]与片下的阵列存储有关

是的

但为什么呢

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
    }