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

Goroutine 填充结构体实例切片

Goroutine 填充结构体实例切片

Go
眼眸繁星 2021-11-29 19:41:26
这是我使用 Go 的第一天,我有一个关于 goroutines 和附加到实例切片的问题。这个想法是每辆卡车都有一个长度为 1 的货物,其中包含一个名为“杂货”的项目。我几乎拥有它,但由于某种原因它正在失去卡车的特性,而且它似乎过早终止。https://play.golang.org/p/f0uIy5qg8dpackage mainimport "fmt"import "time"type Item struct {   name string}type Truck struct{   Cargo []Item   name  string}func UnloadTrucks(ch chan *Truck){    t := <- ch    fmt.Printf("%s has %d items in cargo: %s\n", t.name, len(t.Cargo), t.Cargo[0].name)    time.Sleep(1 * time.Second)    return }func main() {     trucks := make([]Truck, 2)     ch := make(chan *Truck)     for i, t := range trucks{         t.name = fmt.Sprintf("Truck %d", i + 1)     fmt.Printf("Building %s\n", t.name)     }     for _, t := range trucks {            go func(tr *Truck){          itm := Item {}                  itm.name = "Groceries"                  fmt.Printf("Loading %s", tr.name)                  tr.Cargo = append(tr.Cargo, itm)                  ch <- tr            }(&t)     }     UnloadTrucks(ch)}
查看完整描述

1 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

你的问题不是卡车的属性“丢失”了,而是它们从来没有被设置在首位。这个循环是你的问题:


for i, t := range trucks {

    t.name = fmt.Sprintf("Truck %d", i + 1)

    fmt.Printf("Building %s\n", t.name)

}

在此循环中,t是切片中Truck 对象的副本trucks。对该对象的任何修改都不会影响原始卡车。相反,您可以通过使用索引变量i直接访问trucks切片中的对象来引用原始 Truck 对象:


for i, _ := range trucks {

    trucks[i].name = fmt.Sprintf("Truck %d", i + 1)

    fmt.Printf("Building %s\n", trucks[i].name)

}


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信