📕
Golang
  • Собеседование по golang
  • Вопросы собеседования
    • Список вопросов МТС
    • Список вопросов
    • Базовые вопросы по Golang
    • Go. Прорабатываем 25 основных вопросов собеседования
    • Функции
    • Структуры данных
    • Конкурентность и Параллелизм
    • Горутины
    • Примитивы синхронизации
    • Планировщик
    • Go: конкурентность и привязки к потокам в планировщике
    • Каналы
    • GC
  • спецификация
    • Спецификация Go: преобразования в и из строкового типа
    • переключатель типов (type switch)
    • for утверждения (for statements)
    • for утверждения с range условием
    • go утверждения (go statements)
    • select утверждения (select statements)
    • return утверждения (return statements)
    • continue утверждения (continue statements)
    • goto утверждения (goto statements)
    • fallthrough утверждения (fallthrough statements, утверждения "провала")
    • defer утверждения (defer statements)
    • встроенные функции, функция close
    • длина и емкость
    • аллокация, создание срезов (slice), карт (map) и каналов
    • добавление в срезы и копирование срезов
    • удаление элементов карты
    • обработка паники
    • начальная загрузка (bootstrapping)
    • пакеты
    • инициализация и выполнение программы, нулевое значение
    • инициализация пакета
    • выполнение программы
    • ошибки
    • паника во время выполнения (run-time panic)
  • Эффективный go
    • эффективный go
    • 50 оттенков go
    • Go: распространенные антипаттерны
    • Визуализация concurrency в Go с WebGL
  • требования для работы
    • Список навыков
  • habr
    • Изучаем многопоточное программирование в Go по картинкам
    • Go: конкурентность и привязки к потокам в планировщике
  • NP
    • Полиморфизм с интерфейсами в Golang
    • Объектно-ориентированное программирование в Golang
    • Владеешь merge  -  освой и rebase
  • ProgLib
    • Горутины
  • Untitled
  • Оптимизация
    • Go: Должен ли я использовать указатель вместо копии моей структуры?
  • Полезняшки
    • Using PostgreSQL JSONB with Go
Powered by GitBook
On this page

Was this helpful?

  1. спецификация

select утверждения (select statements)

Утверждение "select" выбирает, какой из набора возможных операций отправки или получения будет продолжен. Это похоже на утверждние "switch", но со всеми случаями (cases), относящимися к операциям связи.

SelectStmt = "select" "{" { CommClause } "}" .
CommClause = CommCase ":" StatementList .
CommCase   = "case" ( SendStmt | RecvStmt ) | "default" .
RecvStmt   = [ ExpressionList "=" | IdentifierList ":=" ] RecvExpr .
RecvExpr   = Expression .

Случай (case) с RecvStmt может присвоить результат RecvExpr одной или двум переменным, которые могут быть объявлены с помощью краткого объявления переменных. RecvExpr должен быть (возможно заключенной в скобки) операцией приема. Может быть не более одного случая по умолчанию, и он может появиться в любом месте списка случаев (cases).

Исполнение утверждения "select" происходит в несколько этапов:

  1. Для всех случаев в утверждении операнды канала операций приема и выражения канала и правой части выражений утверждений отправки оцениваются ровно один раз в порядке исходного кода при входе в "select" утверждение. Результатом является набор каналов для приема или отправки и соответствующие значения для отправки. Любые побочные эффекты в этой оценке будут иметь место независимо от того, какая (если таковая имеется) операция связи выбрана для продолжения. Выражения в левой части RecvStmt с кратким объявлением или присваиванием переменной еще не оценены.

  2. Если одно или несколько сообщений может быть продолжено, выбирается одно, которое может продолжаться, посредством равномерного псевдослучайного выбора. В противном случае, если есть случай по умолчанию, этот случай выбирается. Если случай по умолчанию отсутствует, утверждение "select" блокируется до тех пор, пока не будет продолжено хотя бы одно из сообщений.

  3. Если выбранный случай не является случаем по умолчанию, выполняется соответствующая операция связи.

  4. Если выбранный случай представляет собой RecvStmt с коротким объявлением переменной или присваиванием, левые выражения оцениваются и присваивается полученное значение (или значения).

  5. Список выписок выбранного случая выполнен.

Поскольку обмен данными по нулевым каналам никогда не может быть продолжен, select только с нулевыми каналами и без случая по умолчанию блокируется навсегда.

var a []int
var c, c1, c2, c3, c4 chan int
var i1, i2 int
select {
case i1 = <-c1:
  print("received ", i1, " from c1\n")
case c2 <- i2:
  print("sent ", i2, " to c2\n")
case i3, ok := (<-c3):  // то же самое что и: i3, ok := <-c3
  if ok {
    print("received ", i3, " from c3\n")
  } else {
    print("c3 is closed\n")
  }
case a[f()] = <-c4:
  // то же самое что и:
  // case t := <-c4
  //  a[f()] = t
default:
  print("no communication\n")
}

for {  // отправляет случайную последовательность битов в c
  select {
  case c <- 0:  // примечание: нет утверждения, нет fallthrough ("провала" в следующий случай), нет сворачивания случаев
  case c <- 1:
  }
}

select {}  // блокируется навсегда
Previousgo утверждения (go statements)Nextreturn утверждения (return statements)

Last updated 4 years ago

Was this helpful?