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!

questionAnswers(5)

yourAnswerToTheQuestion