При проверке, имеет ли канал готовое к чтению значение, Идет использование

Как я проверяю, имеет ли канал значение для меня для чтения?

Я не хочу блокироваться при чтении канала. Я хочу видеть, имеет ли это значение. Если это действительно будет иметь один, то я считаю его. Если это (еще) не будет иметь того, то я сделаю что-то еще и перепроверю снова позже.

30
задан Alexis Wilke 30 July 2019 в 20:49
поделиться

3 ответа

ПРЕДУПРЕЖДЕНИЕ : это больше не является точным, см. Ответ ниже.

Из документов:

Если при получении или инициализации формы используется выражение получения

x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch

, операция приема становится неблокирующая. Если операция может продолжаться, логическая переменная ok будет установлена ​​в значение true, а значение будет сохранено в x; в противном случае для ok установлено значение false, а для x установлено нулевое значение для его типа

5
ответ дан Martin Probst 27 November 2019 в 23:03
поделиться

Если вы делаете это часто, то это, вероятно, не очень хороший дизайн, и вам лучше создать другую программу, чтобы выполнять любую работу, которую вы планируете делать, когда нечего читать с канала. Синхронная / блокирующая природа каналов Go делает код более легким для чтения и рассуждений, в то время как планировщик и дешевые программы означают, что асинхронные вызовы не нужны, поскольку ожидающие программы занимают очень мало ресурсов.

8
ответ дан Jessta 27 November 2019 в 23:03
поделиться

К сожалению, предыдущие ответы неверны. В спецификации четко сказано, что вы МОЖЕТЕ использовать каналы таким образом, используя функцию len (), но только если вы указали емкость канала - длину буфера для канала при его создании. Если вы опустили пропускную способность канала при его создании - операции канала всегда блокируются.

5
ответ дан Yaroslav Voytovych 27 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: