为了账号安全,请及时绑定邮箱和手机立即绑定

为什么循环中赋值后的ID为0?

为什么循环中赋值后的ID为0?

Go
慕容森 2022-04-20 21:00:42
我正在尝试创建一个结构数组并在其中启动一些数据。结构:type Person struct{    id int    enlighten bool    channel chan int}作业:table := make([]Philospher, numPhil)for i :=0; i < 5; i++{    p  := Philospher{        id: i,        enlighten: false,        channel: make(chan int),    }    table = append(table, p)}for j :=0; j < 5; j++{    fmt.Println(table[j].id);}以下是上述代码的输出:00000我想弄清楚为什么不是01234我也试过&在Philospher前面用add,还是一样的
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您的make电话正在创建一个初始长度为 5 的 Philosopher 切片。从规范中:

使用内置函数 为给定元素类型 T 创建一个新的初始化切片值,该函数make接受切片类型和指定长度和可选容量的参数。使用 make 创建的切片总是分配一个新的隐藏数组,返回的切片值指向该数组。也就是说,执行

make([]T, length, capacity)

前 5 位哲学家是哲学家的零值。您将另外 5 个 Philosophers 附加到切片的末尾,使其最终长度为 10。我相信你的意思是创建一个长度为 0 但容量为 5 的切片:

table := make([]Philosopher, 0, numPhil)

https://play.golang.org/p/a5QP6wd6Rs_9


查看完整回答
反对 回复 2022-04-20
?
桃花长相依

TA贡献1860条经验 获得超8个赞

因为这:

table := make([]Philospher, numPhil)

table使用numPhil空元素创建。然后你将你Philosohper的 s 添加到这个空表的末尾,并打印前 5 个。显然,numPhil >= 5,所以它打印出第一个空表。

将初始化更改为:

table:= make([]Philosopher,0,numPhil)

为 numPhil 元素保留空间,大小为 0。


查看完整回答
反对 回复 2022-04-20
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号