Оператор select
выбирает case
, операция связи которого не блокируется. Если есть несколько случаев, чьи комм. Операция не блокирует, один выбирается случайно.
Так как в этом примере все операции связи будут блокироваться, и, поскольку предоставляется default
, это будет выполнено.
Чтобы "вызвать" другой случай, вы должны убедиться, что он комм. оп не блокирует. В этом примере никто не отправляет и не получает ничего из каналов, которые используются в делах. Черт, они даже не инициализированы. И как отправка, так и получение от nil
блоков каналов навсегда (подробности см. Как ведет себя неинициализированный канал? ). Поэтому вы должны сделать это: инициализировать канал и отправить / получить от него тот, чей случай вы хотите вызвать. Например:
c1 = make(chan int, 1)
c1 <- 1
Этот фрагмент инициализирует канал c1
с буфером 1 и отправляет ему значение. Таким образом, в операторе select
после этого операция связи i1 = <-c1
не будет блокироваться, поэтому она будет выбрана, и результат будет:
received 1 from c1
Попробуйте на Go Playground . (Примечание: я изменил все Printf()
звонки на Println()
.)
Обратите внимание, что отправка / получение по каналам может происходить одновременно с другими программами. Я выбрал буферизованный канал и ту же программу для простоты, чтобы он вел себя так, как вы ожидаете, даже на игровой площадке Go.
Подробнее о каналах: Для чего используются каналы Голанга?