douewei1665 2016-04-26 11:32
浏览 22

为什么呼叫者看不到分片中的新数据? [重复]

This question already has an answer here:

In the below code, why are both fmt.Println(len(people)) printing 0? As pointed out here, https://stackoverflow.com/a/2441112/315445, and elsewhere, slice is reference type. Why isn't caller (main) seeing the updated data?

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"})
}

But this works. So its not actually a 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
}
</div>
  • 写回答

1条回答 默认 最新

  • dqvy87517 2016-04-26 11:51
    关注

    A slice contains a pointer to the backing array, length and capacity. The append built-in returns a new slice with a new length and possibly a new pointer to a reallocated backing array.

    Slices are passed by value. Changes to the slice in getList are not visible in the caller. Changes to the backing array are visible to the caller.

    A slice is called a reference type because a slice contains a pointer to the backing array.

    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值