Я вот сейчас подумал, бывает такое что нужно как-то распаралелить for по массиву. В итоге у меня получается что-то вроде
var wg sync.WaitGroup wg.Add(len(array)) results := make(chan int, len(array)) for _, x := range array { go func(x int) { results <- x * x wg.done() } } wg.Wait() for y := <- results ...
С одной стороны работает, с другой как-то много мусора вокруг. Может есть какие-то способы поумнее?
Вцелом ок, зависит от чтения, которого в примере нет. Если там 1 рутина, то разницы нет. С каналами и правда больше кода.
Если я в горутине делаю append слайсу обьявленному за ее пределами, процедура локается или нужно руками лочить слайс, чтоб другая горутина не втиснулась между чтением и записью?
Нужно руками локать. Ну те как, ошибки при конкурентной вставке в слайс не будет, но это рейс, и в итоге в слайсе будет меньше элементов