![image.png](https://static.studygolang.com/200628/05fb7a7a5ae14122e55b7452d3d62f5d.png)
# 有个问题需要大神帮忙解决一下
- 1,当对s2进行append数据时,为什么s1没有改变
- 2,当对s1进行append追加s2数据时,为什么会改变s2的值
s2 := s1, s2和s1都是[0,0,0],并指向同一底层数组,底层数组是[0,0,0,0,0,0,0,0,0,0],
s2[0] = 100, s2和s1都是[100,0,0],底层数组[100,0,0,0,0,0,0,0,0,0],
s2 = append(s2, 1, 2, 3, 4), s1是[100,0,0], s2是[100,0,0,1,2,3,4], 底层数组是[100,0,0,1,2,3,4,0,0,0],
s1 = append(s1, s2...), s1是[100,0,0,100,0,0,1,2,3,4], s2是[100,0,0,100,0,0,1], 底层数组[100,0,0,100,0,0,1,2,3,4],
切片是对底层数组某一段的截取,切片的改变会影响它在底层数组对应的那一段
#9
更多评论
这样的结果的确令人困惑,
能否认为这是一个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