Пример канала выписки - PullRequest
0 голосов
/ 26 апреля 2018

Я новичок в golang и пытаюсь понять, как работает оператор select https://www.tutorialspoint.com/go/go_select_statement.htm

package main

import "fmt"

func main() {
   var c1, c2, c3 chan int
   var i1, i2 int
   select {
      case i1 = <-c1:
         fmt.Printf("received ", i1, " from c1\n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2\n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok {
            fmt.Printf("received ", i3, " from c3\n")
         } else {
            fmt.Printf("c3 is closed\n")
         }
      default:
         fmt.Printf("no communication\n")
   }    
}   

На данный момент не было никаких объяснений о каналах. Теперь я понятия не имею, как вызвать другой выход как «нет связи».

Кто-нибудь может дать пример для каждого случая?

1 Ответ

0 голосов
/ 26 апреля 2018

Оператор 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.

Подробнее о каналах: Для чего используются каналы Голанга?

...