并发 – Golang:匿名结构和空结构
|
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 %sn",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{}{}
为什么我们需要这个奇怪的结构?是空结构还是匿名结构?我google了,但找不到正确的答案或文档来解释这一点。 最初的来源是安德鲁·格兰德的讲话 这里 make(chan struct{})
done是一个struct {}的通道 所以我试过 done <- struct{}
但它不工作。为什么我需要这条线额外的方括号? done <- struct{}{}
[第二题] for _ = range langs { <-done }
为什么我需要这一行?我知道这条线是必要的,因为没有这条线,没有输出。但为什么和这条线做什么?这个代码有什么需要的?我知道< -done是从完成的通道接收值,并丢弃接收到的值。但为什么我需要这样做? 谢谢!
struct {} {}是一个类型为struct {}的复合文字,后面跟着一个括号的复合元素列表的类型。 对于_ = range langs {< -done}正在等待,直到所有lang的所有goroutines都发送完成消息。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
