Играя с каналами и рутингами Go, я столкнулся с своеобразным поведением, которое я надеялся, что кто-нибудь сможет объяснить.Выбор внутри goroutine оценивает каждое другое утверждение
Ниже приведена короткая программа, которая должна печатать пару строк в stdout, отправив строки по каналу в «прослушиватель» (оператор выбора), работающий в отдельной версии goroutine.
package main
import (
"fmt"
"time"
)
func main() {
a := make(chan string)
go func() {
for {
select {
case <-a:
fmt.Print(<-a)
}
}
}()
a <- "Hello1\n"
a <- "Hello2\n"
a <- "Hello3\n"
a <- "Hello4\n"
time.Sleep(time.Second)
}
Использование
go func() {
for s := range a {
fmt.Print(s)
}
}()
// or even simpler
go func() {
for {
fmt.Print(<-a)
}
}()
работает, как ожидалось. Тем не менее, запустив верхний фрагмент с отборным заявлением производит следующий вывод:
Hello2
Hello4
т.е. печатается только каждый оператор. Что это за колдовство?
Спасибо, это имеет смысл. Я отдам это;) – 0sh