golang 切片append问题

wangam · 2020-06-28 15:05:33 · 2057 次点击

不是bug,只是你没理解而已,还有,认真解决问题,不要搞笑

#10
更多评论

这样的结果的确令人困惑, 能否认为这是一个golang的bug? 改成如下的代码结果会让人更加迷惑.

package main

import "fmt"

func main() {
   fmt.Println("Hello, World!")
    s1 := make([]int, 3, 10)
    s2 := s1
    s2[0] = 100
    fmt.Println(s1)
    fmt.Println(s2)
    s2 = append(s2, 1, 2, 3, 4)
    fmt.Println(s1, cap(s1), s2, cap(s2))
    s1 = append(s1, s2...)
    fmt.Println(s1, cap(s1), s2, cap(s2))
    s2 = append(s2, 1000)
    fmt.Println(s1, cap(s1), s2, cap(s2))
}

结果如下:
Hello, World!
[100 0 0]
[100 0 0]
[100 0 0] 10 [100 0 0 1 2 3 4] 10
[100 0 0 100 0 0 1 2 3 4] 10 [100 0 0 100 0 0 1] 10
[100 0 0 100 0 0 1 1000 3 4] 10 [100 0 0 100 0 0 1 1000] 10
#1

slice是一段内存地址。

然后有对应有效位数和最大长度(cap)

s1和s2是应对到同一段内存地址,有不同的有效位数的指。

append操作既该表 内存地址中的值,又改变了有效位数。

要避免这个问题,你需要不用使用s2:=s1这样含义不明的操作。

要复制Slice的话,使用make然后copy。

#2