【发布时间】:2014-01-14 15:00:05
【问题描述】:
http://play.golang.org/p/vhaKi5uVmm
package main
import "fmt"
var battle = make(chan string)
func warrior(name string, done chan struct{}) {
select {
case opponent := <-battle:
fmt.Printf("%s beat %s\n", name, opponent)
case battle <- name:
// I lost :-(
}
done <- struct{}{}
}
func main() {
done := make(chan struct{})
langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"}
for _, l := range langs { go warrior(l, done) }
for _ = range langs { <-done }
}
[第一个问题]
done <- struct{}{}
我们如何以及为什么需要这个看起来很奇怪的结构?它是空结构还是匿名结构?我用谷歌搜索了它,但找不到正确的答案或文档来解释这一点。
原文来自 Andrew Gerrand 的演讲 http://nf.wh3rd.net/10things/#10
这里
make(chan struct{})
done 是一个结构类型的通道{}
所以我尝试了
done <- struct{}
但它不起作用。为什么这行需要一个额外的括号?
done <- struct{}{}
[第二个问题]
for _ = range langs { <-done }
为什么我需要这条线?我知道这条线是必要的,因为没有这条线,就没有输出。但是这条线为什么和做什么?是什么使它在这段代码中变得必要?我知道<-done 是从完成的通道接收值并丢弃接收到的值。但是为什么我需要这样做呢?
【问题讨论】:
标签: concurrency go channel goroutine