Ревью: первый успешный ответ среди нескольких узлов
Код-ревьюMiddle10 минпроверка — Спринт10-t040
Функция lookup параллельно ищет q на нескольких узлах (remote.Query) и должна вернуть первый успешный ответ, а если упали все узлы — ошибку. Это чужое решение: работает ли оно, какие у него проблемы и как бы вы его улучшили?
Как на собесе: 10 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.
review.gogo
1funclookup(nodes[]string,qstring)([]string,error){2// буферизированные каналы на все узлы3okCh:=make(chan[]string,len(nodes))4failCh:=make(chanerror,len(nodes))56for_,node:=rangenodes{7node:=node8gofunc(){9res,e:=remote.Query(node,q)10ife!=nil{11failCh<-e12return13}14okCh<-res15}()16}1718failed:=019fori:=0;i<len(nodes);i++{20select{21caseres:=<-okCh:22returnres,nil23casee:=<-failCh:24failed++25iffailed==len(nodes){26returnnil,fmt.Errorf("all nodes failed: %v",e)27}28}29}3031returnnil,fmt.Errorf("unexpected error")32}