var a []X
...
done := make(chan bool)
b := make([]Y,len(a))
for i, _ := range a {
go func (j int){
b[j] = process(a[j])
done <- true
}(i)
}
for n:=0; n<len(a); n++ { _ = <-done }The point is your code is very verbose compared to the original, and anyone will take at least twice as long trying to figure out the interaction between channels and goroutine launches vs the sequential version.
for i, v := range a { a[i] = process(v) }