這是我使用 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 關注
- 233 瀏覽
添加回答
舉報
0/150
提交
取消