Golang: estructura anónima y estructura vacía

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 }
}

[Primera pregunta]

 done <- struct{}{}

¿Cómo y por qué necesitamos esta estructura de aspecto extraño? ¿Es una estructura vacía o una estructura anónima? Lo busqué en Google pero no pude encontrar la respuesta correcta o la documentación para explicar sobre esto.

La fuente original es de la charla de Andrew Gerrandhttp://nf.wh3rd.net/10things/#10

aquí

 make(chan struct{})

hecho es un canal de tipo struct {}

Así que lo intenté con

 done <- struct{}

Pero no está funcionando. ¿Por qué necesito un paréntesis extra para esta línea?

 done <- struct{}{}

[Segunda pregunta]

 for _ = range langs { <-done }

¿Por qué necesito esta línea? Sé que esta línea es necesaria porque sin esta línea, no hay salida. Pero ¿por qué y qué hace esta línea? ¿Y qué lo hace necesario en este código? Yo sé eso<-done Es recibir los valores del canal hecho y descartar los valores recibidos. Pero ¿por qué necesito hacer esto?

¡Gracias!

Respuestas a la pregunta(5)

Su respuesta a la pregunta