我不明白为什么在这段代码中发生了死锁.我尝试了几种不同的东西来阻止僵局(使用WorkGroup的几个不同版本).这是我在Go的第一天,到目前为止我对相当简单和直接的操作的复杂性感到非常失望.我觉得我错过了一些大而明显的东西,但是我发现的所有文档看起来都非常不同于我,这是一种非常基本的操作模式.所有文档都使用基本类型的通道(int,string)而不是更复杂的类型,所有类型都具有非常基本的for循环或者它们位于频谱的另一端,其中函数是相当复杂的编排.
我想我正在寻找一个中间的道路样本"这就是它通常如何做"与goroutines.
package main import "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") }
JimB.. 6
你永远不会关闭"卡车"频道ch
,所以UnloadTrucks
永远不会回来.
完成所有工作后,您可以使用WaitGroup关闭通道:
go func() { wg.Wait() close(ch) }() UnloadTrucks(ch)
http://play.golang.org/p/1V7UbYpsQr
你永远不会关闭"卡车"频道ch
,所以UnloadTrucks
永远不会回来.
完成所有工作后,您可以使用WaitGroup关闭通道:
go func() { wg.Wait() close(ch) }() UnloadTrucks(ch)
http://play.golang.org/p/1V7UbYpsQr