2013-07-30 3 views
1

Как я могу сделать что-то вроде следующего ?:Есть ли способ проверить, буферизуются ли значения в списке хонов?

func foo(input <-chan char, output chan<- string) { 
    var c char 
    var ok bool 
    for { 
     if ThereAreValuesBufferedIn(input) { 
      c, ok = <-input 
     } else { 
      output <- "update message" 
      c, ok = <-input 
     } 
     DoSomethingWith(c, ok) 
    } 
} 

В принципе, я хочу, чтобы проверить, есть ли буферизованные значения в чане, так что, если нет, я могу отправить сообщение об обновлении до резьбы заблокирован.

ответ

3
package main 

func foo(input <-chan char, output chan<- string) { 
     for { 
       select { 
       case c, ok := <-input: 
         if ok { // ThereAreValuesBufferedIn(input) 
           ... process c 
         } else { // input is closed 
           ... handle closed input 
         } 
       default: 
         output <- "update message" 
         c, ok := <-input // will block 
         DoSomethingWith(c, ok) 
       } 

     } 
} 

EDIT: Исправлена ​​ошибка определения ошибки.

+0

Я думаю, что это имеет небольшую ошибку в ней, с и в порядке выходят за рамки к тому времени, вы попали DoSomethingWith, вы должны предварительно объявить их вне выберите с «вар» и использовать «= "вместо: = в предложении select. – LinearZoetrope

+0

@Jsor: Исправлено, спасибо. – zzzz

3

Да, это то, что делает звонок select. Это позволит вам проверить один или несколько каналов для значений, готовых к чтению.

1

Другие ответили на ваш вопрос, что вы хотели сделать с кодом (используйте select), но для полноты и ответа на конкретный вопрос, заданный по типу вашего вопроса («Есть ли способ проверить, если значения буферизуются в Go chan? »), функциии cap работают как ожидалось на буферизованных каналах (len возвращает количество буферизованных элементов, cap возвращает максимальную пропускную способность канала).

http://tip.golang.org/ref/spec#Length_and_capacity

+0

Правильный ответ, просто позвольте мне добавить, что «len» канала неизбежно искушен, поэтому на него нельзя полагаться как детерминированное значение. – zzzz

+0

да, стоит упомянуть. – mna

+0

Для людей, читающих эти комментарии, получается 'len' и' cap' на канале * не * racy. См. Http://tip.golang.org/ref/spec#Send_statements и обсуждение голан-орехов (подтверждено Дмитрием Вюковым): https://groups.google.com/d/msg/golang-nuts/E467Ec0 -bYQ/LVmbCodY1RAJ – mna

Смежные вопросы