为什么调用者不会在切片中看到新数据?

时间:2016-04-26 11:32:38

标签: go slice

在下面的代码中,为什么fmt.Println(len(people))打印0? 正如这里指出的那样,https://stackoverflow.com/a/2441112/315445和其他地方,slice是引用类型。为什么调用者(主)看不到更新的数据?

package main

import "fmt"

type Person struct {
    name string
    age string
}

func main() {
    var people = make([]Person, 0)
    fmt.Println(len(people))
    getList(people)
    fmt.Println(len(people))
}

func getList(people []Person) {
    people = append(people, Person {"Foo", "1"})
    people = append(people, Person {"Bar", "2"})
}

但这很有效。所以它实际上不是pass-by-reference

package main

import "fmt"

type Person struct {
    name string
    age string
}

func main() {
    var people = make([]Person, 0)
    fmt.Println(len(people))
    people = getList(people)
    fmt.Println(len(people))
}

func getList(people []Person) []Person {
    people = append(people, Person {"Foo", "1"})
    people = append(people, Person {"Bar", "2"})
    return people
}

1 个答案:

答案 0 :(得分:2)

切片包含指向后备阵列,长度和容量的指针。附加内置函数返回一个带有新长度的新切片,可能还有一个指向重新分配的后备数组的新指针。

切片按值传递。 getList中切片的更改在调用者中不可见。调用者可以看到对后备阵列的更改。

切片称为引用类型,因为切片包含指向后备数组的指针。