Что такое оператор <-
в языке go? Видели это во многих фрагментах кода, связанных с Go, но в чем смысл этого?
Что такое оператор "меньше, чем следует за тире" на языке go?
Ответ 1
У вас уже есть ответы, но здесь идет.
Подумайте о канале как очереди сообщений.
Если канал находится справа от кнопки со стрелкой влево (<-), это означает, что нужно удалить запись. Сохранение записи в переменной необязательно
e <- q
Если канал находится слева от оператора со стрелкой влево, это означает, что он должен содержать запись.
q <- e
Обратите внимание на "dequeue" (получение) без сохранения в переменной: его можно использовать в небуферизованной очереди для реализации чего-то вроде операции "wait/notify" в Java: одна сопрограмма заблокирована в ожидании деактивации/получить сигнал, затем другой сопроцессор выдает/передает этот сигнал, содержание которого не имеет значения. (поочередно, отправитель может быть заблокирован до тех пор, пока приемник не вытащит сообщение)
Ответ 2
<-
используется более чем в одном месте в спецификации языка:
Оператор
<-
указывает направление канала, его отправку или получение. Если направление не указано, канал является двунаправленным. Канал может быть ограничен только для отправки или получения только путем преобразования или назначения.Для операнда
ch
типа канала значение операции приема<-ch
является значением, полученным от каналаch
. Тип значения - тип элемента канала. Выражение блокируется до тех пор, пока значение не будет доступно. Получение с нулевого канала блокирует навсегда. Получение из закрытого канала всегда выполняется успешно, сразу же возвращая нулевое значение типа элемента.Оператор отправки отправляет значение по каналу. Выражение канала должно быть типа канала, а тип значения должен быть присвоен типу элемента канала.
SendStmt = Channel "<-" Expression .
Channel = Expression .
Оператор приема также является фундаментальной частью оператора select
Ответ 3
Для операнда
ch
типа канала значение операции приема<-ch
- это значение, полученное от каналаch
.
Он получает значение из канала. См. http://golang.org/ref/spec#Receive_operator