golang 切片append问题

wangam · · 1865 次点击
如果要复制slice,用make+copy 要操作slice,用指针
#3
更多评论
这样的结果的确令人困惑, 能否认为这是一个golang的bug? 改成如下的代码结果会让人更加迷惑. ```go 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