Нет, я не верю, что вы правильно понимаете пределы Го.
Во-первых, в Go я не видел ничего такого, что ограничивало бы каналы для связи между двумя подпрограммами. Вы можете передать один и тот же канал как Asearch, так и Bsearch, а затем, в зависимости от того, что закончится, можно отправить результат по этому каналу.
Если вместо этого вы хотите использовать два канала и подождать, пока один из них получит результат, вы можете просто использовать оператор select
. Из учебника Go , пример выбора канала, используемого для отправки запросов, и того, который сигнализирует серверу о выходе:
21 func server(op binOp, service chan *request, quit chan bool) {
22 for {
23 select {
24 case req := <-service:
25 go run(op, req); // don't wait for it
26 case <-quit:
27 return;
28 }
29 }
30 }
Кроме того, хотя прием из канала обычно блокируется, вы также можете сделать неблокирующий прием из канала.
Если выражение получения используется в
назначение или инициализация
форма
x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
операция получения становится
неблокирующая. Если операция может
продолжить, логическая переменная ок будет
быть установленным в true и значение сохранено в
Икс; в противном случае ОК устанавливается на ложь и х
устанавливается в нулевое значение для его типа
(§ Нулевое значение ).
Итак, есть несколько способов дождаться результата от нескольких процедур без блокировки. Я думаю, что я бы пошел с несколькими каналами, мультиплексированными с использованием select
, так как таким образом вы можете легко определить, какая подпрограмма вернула результат, без необходимости упаковывать эту информацию в значение, которое вы отправляете, или делать какую-то другую форму вне полосная связь.