правильный способ ожидания рутины, чтобы закончить

Я хочу знать, как правильно дождаться окончания процедуры перед выходом из программы. Читая некоторые другие ответы, кажется, что Бул Чан добьется цели, как вСсылка на игровую площадку

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
}

У меня есть два вопроса здесь:

почему <- сделано вообще работает?

что произойдет, если я раскомментирую последнюю строку? У меня ошибка тупика. Это потому, что канал пуст, и нет другой функции, посылающей ему значения?

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

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