为什么golang追加相同的切片结果会共享一个内存地址?

时间:2017-05-16 02:55:39

标签: go append

我认为append在go中会返回一个新结果,但我发现在同一切片中追加会返回相同的内存地址:

func TestRuneAppend3(t *testing.T) {
    r := make([][]rune, 256)
    r[0] = append(r[0], 99)  // c
    r[1] = append(r[0], 100) // d
    r[2] = append(r[0], 101) // e
    // I thought it would be "c cd ce", but it is "c ce ce"
    log.Println(string(r[0]), string(r[1]), string(r[2]))
}

那么,如果我想要结果的最佳方法是c cd ce

1 个答案:

答案 0 :(得分:3)

如果您要追加的切片中没有足够的容量,则附加只会分配一个新数组。如果您需要一个单独的数组,请使用make创建一个新切片,并使用copy从原始切片中复制您需要的任何内容。

This article可以很好地解释切片是如何工作的。