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

问题描述 投票:0回答:1

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

谢谢,:)

go slice
1个回答
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 |
© www.soinside.com 2019 - 2024. All rights reserved.