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 aussehenden struct? Ist es leer, struct oder anonyme struct? Ich habe es gegoogelt, konnte aber nicht die richtige Antwort oder die Dokumentation zu erklären.

Die original-Quelle ist von Andrew Gerrand sprechen
http://nf.wh3rd.net/10things/#10

Hier

 make(chan struct{})

fertig ist ein channel vom Typ struct{}

Also versuchte ich mit

 done <- struct{}

Aber es funktioniert nicht. Warum brauche ich eine extra Klammern für diese Zeile?

 done <- struct{}{}

[2. Frage]

 for _ = range langs { <-done }

Warum benötige ich diese Zeile? Ich weiß, dass diese Zeile ist notwendig, weil ohne diese Zeile keine Ausgabe. Aber Warum und was bewirkt diese Zeile? Und was es notwendig macht, in diesem code? Ich weiß, dass <-done erhalten Werte aus dem Kanal getan und löschen der empfangenen Werte. Aber warum muss ich das tun?

Dank!

InformationsquelleAutor der Frage | 2013-12-27

Schreibe einen Kommentar