Голанг: анонимная структура и пустая структура
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 }
}
[1-й вопрос]
done <- struct{}{}
Как и зачем нам нужна эта странная структура? Это пустая структура или анонимная структура? Я гуглил это, но не мог найти правильный ответ или документацию, чтобы объяснить об этом.
Первоисточник из выступления Эндрю Геррандаhttp://nf.wh3rd.net/10things/#10
Вот
make(chan struct{})
done это канал типа struct {}
Итак, я попробовал с
done <- struct{}
Но это не работает. Зачем мне нужны дополнительные скобки для этой строки?
done <- struct{}{}
[2-й вопрос]
for _ = range langs { <-done }
Зачем мне эта линия? Я знаю, что эта строка необходима, потому что без этой строки нет вывода. Но почему и что делает эта линия? И что делает это необходимым в этом коде? я знаю это<-done
заключается в получении значений из готового канала и отбрасывании полученных значений. Но зачем мне это делать?
Спасибо!