Ревью: первый успешный ответ среди нескольких узлов

Код-ревьюMiddle10 минпроверка — Спринт10-t040

Функция lookup параллельно ищет q на нескольких узлах (remote.Query) и должна вернуть первый успешный ответ, а если упали все узлы — ошибку. Это чужое решение: работает ли оно, какие у него проблемы и как бы вы его улучшили?

Как на собесе: 10 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.

review.gogo
1func lookup(nodes []string, q string) ([]string, error) {2	// буферизированные каналы на все узлы3	okCh := make(chan []string, len(nodes))4	failCh := make(chan error, len(nodes))5 6	for _, node := range nodes {7		node := node8		go func() {9			res, e := remote.Query(node, q)10			if e != nil {11				failCh <- e12				return13			}14			okCh <- res15		}()16	}17 18	failed := 019	for i := 0; i < len(nodes); i++ {20		select {21		case res := <-okCh:22			return res, nil23		case e := <-failCh:24			failed++25			if failed == len(nodes) {26				return nil, fmt.Errorf("all nodes failed: %v", e)27			}28		}29	}30 31	return nil, fmt.Errorf("unexpected error")32}
⌘ Enter — проверить