我只是用golang尝试了一些简单的东西,就得到了这种行为
有人可以向我解释为什么吗?我觉得我对它的理解不正确...
package main
import (
"fmt"
)
func main() {
s := []int{1, 2, 3}
fmt.Println(s)
fmt.Println("----")
a := s[0:2]
fmt.Println(s)
fmt.Println(a)
a = append(a, 5)
fmt.Println("----")
fmt.Println(s)
fmt.Println(a)
a = append(a, 6)
fmt.Println("----")
fmt.Println(s)
fmt.Println(a)
}
响应:
[1 2 3]
----
[1 2 3]
[1 2]
----
[1 2 5]
[1 2 5]
----
[1 2 5]
[1 2 5 6]
我期望:
[1 2 3]
----
[1 2 3]
[1 2]
----
[1 2 3]
[1 2 5]
----
[1 2 3]
[1 2 5 6]
先谢谢您,:)
答案 0 :(得分:3)
您使用切片。 Slice是具有三个元素的结构,其中一个是指向具有数据(第二个容量,第三个长度)的数组的指针。
s -> array | 1 | 2 | 3 |
下一步
a := s[0:2]
现在您有两个切片,但是它们都指向同一个数组,并且切片共享它们的数据。
s -> array | 1 | 2 | 3 | <- a
下一步:
a = append(a, 5)
您在此处向第二个切片添加了元素,但是此切片与第一个切片共享相同的数组,因此您重写了第一个切片(和数组)的最后一个元素。
s -> array | 1 | 2 | 5 | <- a
下一步:
a = append(a, 6)
在这里,您向第二个切片添加了另一个元素。但是用于此切片的数组不能包含更多元素,因此重新创建了第二个切片的数组。 Go已经创建了新数组,将所有元素从第一个数组复制到该数组,然后将此新数组用于第二个切片。第一个切片仍使用其自己的数组。
s -> array | 1 | 2 | 5 |
a -> array | 1 | 2 | 5 | 6 |