Я не совсем уверен, о чем вы спрашиваете, но в коде, который вы предоставили, есть небольшая ошибка.
Канал done
- это обычный способ блокировки до завершения действия.Он используется следующим образом:
done := make(chan X) // Where X is any type
go func() {
// Some logic, possibly in a loop
close(done)
}()
// Other logic
<-done // Wait for `done` to be closed
Тип канала не важен, поскольку по каналу не передаются никакие данные, поэтому bool
работает, но struct{}
более идиоматичен, так какэто означает, что данные не могут быть отправлены.
Ваш пример почти делает это, за исключением того, что он никогда не вызывает close(done)
.Это ошибка.Это означает, что код всегда будет ждать вечно в <-done
, что сводит на нет всю цель готового канала.Ваш пример кода никогда не выйдет .
Это означает, что код, который вы предоставили, также может быть записан как:
go func() {
// Do stuff
}()
// Do other stuff
<Any code that blocks forever>
Поскольку существует бесчисленное множество способовблокируйте навсегда - ни один из них никогда не будет полезен на практике - канал в вашем примере не нужен.