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!

Antworten auf die Frage(5)

Ihre Antwort auf die Frage