代码是从下面看到
https://stackoverflow.com/questions/20793568/golang-anonymous-struct-and-empty-struct
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 }
}
这段代码主要解决的问题是 : 主函数(main)与子协程的同步问题. 即 main要同步它们,不提前做其他事情.
接下来分析一下代码
初始化
done := make(chan struct{})
导入同步标志
done <- struct{}{}
导出同步标志
for _ = range langs { <-done }
这里的做法让人有一种错觉,和queue和stack类似,如果 <-done 这操作没有指示弹出,就会一直处于阻塞状态,直到有指示位置. 但是,这里就有个问题,它有buffer吗? 从代码上看,它是没有的,那么它如何实现这种类似queue和stack的队列?
参考:
http://www.jb51.cc/article/p-ppexneqk-bre.html
我的理解是,这里的信号存入和信号取出是即时的,先执行「取|读」,这个行为触发了「存|写」
原文链接:https://www.f2er.com/go/188468.html