У меня есть несколько goroutines, пытающихся получить на одном и том же канале одновременно. Похоже, что последний горутин, который начинает получать по каналу, получает значение. Это где-то в спецификации языка или это поведение undefined?
c := make(chan string)
for i := 0; i < 5; i++ {
go func(i int) {
<-c
c <- fmt.Sprintf("goroutine %d", i)
}(i)
}
c <- "hi"
fmt.Println(<-c)
Вывод:
goroutine 4
EDIT:
Я только понял, что это сложнее, чем я думал. Сообщение передается по всем goroutines.
c := make(chan string)
for i := 0; i < 5; i++ {
go func(i int) {
msg := <-c
c <- fmt.Sprintf("%s, hi from %d", msg, i)
}(i)
}
c <- "original"
fmt.Println(<-c)
Вывод:
original, hi from 0, hi from 1, hi from 2, hi from 3, hi from 4