Голанг: анонимная структура и пустая структура

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-й вопрос]

 done <- struct{}{}

Как и зачем нам нужна эта странная структура? Это пустая структура или анонимная структура? Я гуглил это, но не мог найти правильный ответ или документацию, чтобы объяснить об этом.

Первоисточник из выступления Эндрю Геррандаhttp://nf.wh3rd.net/10things/#10

Вот

 make(chan struct{})

done это канал типа struct {}

Итак, я попробовал с

 done <- struct{}

Но это не работает. Зачем мне нужны дополнительные скобки для этой строки?

 done <- struct{}{}

[2-й вопрос]

 for _ = range langs { <-done }

Зачем мне эта линия? Я знаю, что эта строка необходима, потому что без этой строки нет вывода. Но почему и что делает эта линия? И что делает это необходимым в этом коде? я знаю это<-done заключается в получении значений из готового канала и отбрасывании полученных значений. Но зачем мне это делать?

Спасибо!

Ответы на вопрос(5)

Ваш ответ на вопрос