Хотя я не нашел ответа в документации, похоже, получает значение подпрограмма, которая сначала пыталась прочитать с канала.В нашем случае метод main
всегда почти всегда достигает <-done
(99,0%), потому что подпрограммы запускаются асинхронно и требуют времени для запуска.Но в любом случае, я настоятельно рекомендую вам не полагаться на это, так как это не гарантируется.
Чтобы продемонстрировать это, посмотрите на следующий пример:
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan bool)
n := 5
for i := 0; i < n; i++ {
go func(i int) {
fmt.Println(i, "Waiting to read")
<-done
fmt.Println(i, "DONE")
}(i)
time.Sleep(time.Second)
}
time.Sleep(time.Second)
for i := 0 ; i < n; i++ {
time.Sleep(time.Second)
done <- true
}
time.Sleep(time.Second)
}
, который будет производить вывод
0 Waiting to read
1 Waiting to read
2 Waiting to read
3 Waiting to read
4 Waiting to read
0 DONE
1 DONE
2 DONE
3 DONE
4 DONE