Есть несколько способов сделать это, хотя, на мой взгляд, лучше всего этого не делать. Это один из тех распространенных шаблонов, который лучше оставить явным, потому что его намного легче читать и поддерживать. Однако, если вы настаиваете:
Один из способов сделать это - понять, что вам действительно не нужно передавать элементы среза:
func Parallelize(n int, c chan interface{}, f func(int, chan interface{})) {
var wg sync.WaitGroup
defer wg.Done()
for i:=0;i<n;i++ {
wg.Add(1)
go f(i, c)
}
wg.Wait()
close(c)
}
И вызвать его, используя:
Parallelize(len(slice), ch, func(i int,ch chan interface{}) {
// use slice[i]
})
Вам также не нужно передавать канал:
func Parallelize(n int, f func(int)) {
var wg sync.WaitGroup
defer wg.Done()
for i:=0;i<n;i++ {
wg.Add(1)
go f(i)
}
wg.Wait()
}
И назовите его:
Parallelize(len(slice), func(i int) {
// use slice[i] and chan ch
})`
close(ch)
Другой способ сделать это - использовать отражение. Это будет уродливее, и вам придется иметь дело с ошибками времени выполнения вместо ошибок времени компиляции.