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{})
完成是struct {}类型的通道
所以我尝试了
done <- struct{}
但这是行不通的。为什么我需要为该行加一个括号?
[第二个问题]
for _ = range langs { <-done }
为什么我需要这条线?我知道这行是必要的,因为没有这行,就没有输出。但是,为什么这行呢?什么使该代码有必要?我知道这<-done是从已完成的通道接收值并丢弃接收到的值。但是,为什么我需要这样做?
<-done
复合文字 复合文字量为结构,数组,切片和映射构造值,并在每次对其求值时创建一个新值。它们由值的类型和紧随其后的复合元素列表组成。元素可以是单个表达式或键值对。
复合文字
复合文字量为结构,数组,切片和映射构造值,并在每次对其求值时创建一个新值。它们由值的类型和紧随其后的复合元素列表组成。元素可以是单个表达式或键值对。
struct{}{}是type的复合文字,struct{}值的类型后跟大括号绑定的复合元素列表。
struct{}{}
struct{}
for _ = range langs { <-done }正在等待,直到所有goroutines langs已发送所有done消息。
langs
done