func main() {
messages := make(chan string)
go func() { messages <- "hello" }()
go func() { messages <- "ping" }()
msg := <-messages
msg2 := <-messages
fmt.Println(msg)
fmt.Println(msg2)
Приведенный выше код последовательно печатает «ping» и затем «hello» на моем терминале.Я запутался в том порядке, в котором это печатается, поэтому мне было интересно, смогу ли я получить некоторые разъяснения по поводу моего мышления.
Я понимаю, что небуферизованные каналы блокируются при ожидании как отправителя, так и получателя.Таким образом, в приведенном выше случае, когда выполняются эти 2 подпрограммы, в обоих случаях еще нет получателя.Поэтому я предполагаю, что обе процедуры блокируются до тех пор, пока на канале не появится приемник.
Теперь ... Я бы предположил, что сначала в канал пробуется "привет", но он должен ждать ... вВ это же время «пинг» пытается, но снова приходится ждать.Затем появляется
msg := <- messages
, поэтому я предполагаю, что на этом этапе программа произвольно выберет одну из ожидающих программ и разрешит ей отправить свое сообщение в канал, поскольку msg готова к приему.
Однако, кажется, что независимо от того, сколько раз я запускаю программу, всегда сообщается, что msg назначается «ping», а msg2 назначается «hello», что создает впечатление, что «ping» всегдаполучает приоритет для отправки первым (в MSG).Почему это?