有人可以向我解释这种行为吗?

时间:2019-10-23 10:10:57

标签: go slice

我只是用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)
}

Go Playground

响应:

[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]

先谢谢您,:)

1 个答案:

答案 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 |
相关问题