簡體   English   中英

Goroutine填充結構實例切片

[英]Goroutine to populate struct instance slice

這是我使用Go的第一天,我有一個關於goroutine並附加到實例切片的問題。

這個想法是,每輛卡車將有一個長度為1的貨物,其中包含一個名為“雜貨”的商品。 我幾乎擁有它,但由於某種原因,它正在失去卡車的性能,並且似乎過早終止。

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

 package main import "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) } 

您的問題不是卡車的屬性“丟失”,而是永遠不會將其設置為第一位。 這個循環是您的問題:

for i, t := range trucks {
    t.name = fmt.Sprintf("Truck %d", i + 1)
    fmt.Printf("Building %s\n", t.name)
}

在此循環內, ttrucks切片中卡車對象的副本 對此對象進行的任何修改都不會影響原始卡車。 相反,您可以通過使用索引變量i直接訪問trucks切片中的對象來引用原始的卡車對象:

for i, _ := range trucks {
    trucks[i].name = fmt.Sprintf("Truck %d", i + 1)
    fmt.Printf("Building %s\n", trucks[i].name)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM