这是我使用 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)
}
- 1 回答
- 0 关注
- 198 浏览
添加回答
举报
0/150
提交
取消