Golang: anonymous struct i empty struct
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 }
}
[Pierwsze pytanie]
done <- struct{}{}
Jak i dlaczego potrzebujemy tej dziwnie wyglądającej struktury? Czy jest to pusta struktura lub anonimowa struktura? Wyszukałem go w Google, ale nie mogłem znaleźć właściwej odpowiedzi ani dokumentacji, aby to wyjaśnić.
Oryginalne źródło pochodzi z rozmowy Andrew Gerrandahttp://nf.wh3rd.net/10things/#10
Tutaj
make(chan struct{})
done jest kanałem typu struct {}
Więc spróbowałem
done <- struct{}
Ale to nie działa. Dlaczego potrzebuję dodatkowych wsporników dla tej linii?
done <- struct{}{}
[Drugie pytanie]
for _ = range langs { <-done }
Dlaczego potrzebuję tej linii? Wiem, że ta linia jest konieczna, ponieważ bez tej linii nie ma wyjścia. Ale dlaczego i co robi ta linia? A co czyni to koniecznym w tym kodzie? wiem to<-done
jest odbieranie wartości z wykonanego kanału i odrzucanie otrzymanych wartości. Ale dlaczego muszę to zrobić?
Dzięki!