這是我使用 Go 的第一天,我有一個關(guān)于 goroutines 和附加到實(shí)例切片的問題。這個想法是每輛卡車都有一個長度為 1 的貨物,其中包含一個名為“雜貨”的項(xiàng)目。我?guī)缀鯎碛兴捎谀撤N原因它正在失去卡車的特性,而且它似乎過早終止。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貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個贊
你的問題不是卡車的屬性“丟失”了,而是它們從來沒有被設(shè)置在首位。這個循環(huán)是你的問題:
for i, t := range trucks {
t.name = fmt.Sprintf("Truck %d", i + 1)
fmt.Printf("Building %s\n", t.name)
}
在此循環(huán)中,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 關(guān)注
- 226 瀏覽
添加回答
舉報(bào)
0/150
提交
取消