Я читал о некоторых утверждениях и шагах его выполнения, но я не совсем понимаю, что здесь происходит.Выберите нюансы вывода
Я создал два примера Fan-В функции (от Go Concurrency Patterns talk)
select {
case value := <-g1:
c <- value
case value := <-g2:
c <- value
}
отпечатки от каждого канала, как ожидается (каждый канал сохраняет свой собственный счетчик):
Bob : 0
Alice: 0
Bob : 1
Alice: 1
Bob : 2
Alice: 2
Alice: 3
Alice: 4
Bob : 3
Alice: 5
select {
case c <- <-g1:
case c <- <-g2:
}
Это случайный выбор канала и отбрасывая другую свое значение:
Bob : 0
Alice: 1
Alice: 2
Alice: 3
Bob : 4
Alice: 5
Bob : 6
Alice: 7
Alice: 8
Bob : 9
Update: при написании этого вопроса, я думал, что второй select
was equal to:
var v string
select {
case v = <-g1:
case v = <-g2:
c <- v
}
Но я был неправильно, потому что он всегда печатает со второго канала (
, как и ожидалось от оператора типа switch
, потому что в выборе нет провала заявления):
Bob : 0
Bob : 1
Bob : 2
Bob : 3
Bob : 4
Bob : 5
Bob : 6
Bob : 7
Bob : 8
Bob : 9
Понимает ли кто-то, почему мой второй пример создает последовательность?
Спасибо,
Я ... на самом деле не уверен, что там происходит, но я скажу вам, что ваш третий пример не работает, потому что нет автоматического провала (и нет провала в select statement, period). – andlabs
@andlabs, вы правы, спасибо, отредактируйте вопрос – rvignacio