我不明白為什么在這段代碼中會發(fā)生死鎖。我嘗試了幾種不同的方法來停止僵局(使用 WorkGroup 的幾個不同版本)。這是我在 Go 的第一天,到目前為止,我對相當(dāng)簡單直接的操作的復(fù)雜性感到非常失望。我覺得我錯過了一些大而明顯的東西,但是我在這方面找到的所有文檔似乎都與對我來說非?;镜牟僮髂J椒浅2煌K械奈臋n都使用原始類型的通道(int、string)而不是更復(fù)雜的類型,所有這些都帶有非?;镜?for 循環(huán),或者它們位于頻譜的另一端,其中函數(shù)是相當(dāng)復(fù)雜的編排。我想我真的在尋找使用 goroutines 的“這通常是如何完成的”的中間樣本。package mainimport "fmt"//import "sync"import "time"type Item struct { name string}type Truck struct { Cargo []Item name string}func UnloadTrucks(c chan Truck) { for t := range c { fmt.Printf("%s has %d items in cargo: %s\n", t.name, len(t.Cargo), t.Cargo[0].name) }}func main() { trucks := make([]Truck, 2) ch := make(chan Truck) for i, _ := range trucks { trucks[i].name = fmt.Sprintf("Truck %d", i+1) fmt.Printf("Building %s\n", trucks[i].name) } for t := range trucks { go func(tr Truck) { itm := Item{} itm.name = "Groceries" fmt.Printf("Loading %s\n", tr.name) tr.Cargo = append(tr.Cargo, itm) ch <- tr }(trucks[t]) } time.Sleep(50 * time.Millisecond) fmt.Println("Unloading Trucks") UnloadTrucks(ch) fmt.Println("Done")}
1 回答

翻翻過去那場雪
TA貢獻(xiàn)2065條經(jīng)驗 獲得超14個贊
你永遠(yuǎn)不會關(guān)閉“卡車”頻道ch,所以UnloadTrucks永遠(yuǎn)不會回來。
您可以在所有工作人員完成后關(guān)閉通道,使用 WaitGroup:
go func() {
wg.Wait()
close(ch)
}()
UnloadTrucks(ch)
http://play.golang.org/p/1V7UbYpsQr
- 1 回答
- 0 關(guān)注
- 208 瀏覽
添加回答
舉報
0/150
提交
取消