Golang: anonyme Struktur und leere Struktur
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. Frage
done <- struct{}{}
Wie und warum brauchen wir diese seltsam aussehende Struktur? Ist es eine leere Struktur oder eine anonyme Struktur? Ich habe es gegoogelt, konnte aber keine richtige Antwort oder Dokumentation finden, um dies zu erklären.
Die ursprüngliche Quelle stammt aus Andrew Gerrands Vortraghttp://nf.wh3rd.net/10things/#10
Hier
make(chan struct{})
done ist ein Channel vom Typ struct {}
Also versuchte ich es mit
done <- struct{}
Aber es funktioniert nicht. Warum brauche ich für diese Linie zusätzliche Klammern?
done <- struct{}{}
[2. Frage]
for _ = range langs { <-done }
Warum brauche ich diese Leitung? Ich weiß, dass diese Zeile notwendig ist, weil ohne diese Zeile keine Ausgabe möglich ist. Aber warum und was macht diese Linie? Und was macht es in diesem Code notwendig? ich weiß das<-done
soll Werte vom Kanal empfangen und die empfangenen Werte verwerfen. Aber warum muss ich das tun?
Vielen Dank!