maneira adequada de aguardar o término de uma rotina

Desejo saber qual é a maneira correta de aguardar o término de uma rotina antes de sair do programa. Lendo algumas outras respostas, parece que um bool chan fará o truque, como emLink para parque infantil

func do_stuff(done chan bool) {
    fmt.Println("Doing stuff")
    done <- true
}

func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
    //<-done
}

Eu tenho duas perguntas aqui:

por que o <- done funciona?

o que acontece se eu descomentar a última linha? Eu tenho um erro de conflito. Isso ocorre porque o canal está vazio e não há outra função enviando valores para ele?

questionAnswers(2)

yourAnswerToTheQuestion