Zabawa z kanałami i procedurami Go, natknąłem się na dziwne zachowanie, miałem nadzieję, że ktoś może wyjaśnić.Wybrać w goroutine ocenia każde inne stwierdzenie
Poniżej znajduje się krótki program, który ma wydrukować kilka ciągów na standardowe wyjście, wysyłając ciągi przez kanał do "słuchacza" (instrukcja SELECT) działającego w oddzielnym gorylerze.
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)
}
Korzystanie
go func() {
for s := range a {
fmt.Print(s)
}
}()
// or even simpler
go func() {
for {
fmt.Print(<-a)
}
}()
działa zgodnie z oczekiwaniami. Jednak działa szczytowego fragment z instrukcji wyboru daje następujący wynik:
Hello2
Hello4
czyli każdy inny rachunek jest drukowana tylko. Co to za magia?
Dzięki, to ma sens. Dam ci szansę;) – 0sh