En Go cuando queremos ejecutar una corutina luego que se ejecuten un conjunto de corutinas, podemos utilizar waitgroup.
import (
"fmt"
"strconv"
"sort"
"math/rand"
"math"
"sync"
)
func main() {
fmt.Println("enter quantity of integers")
var nroStr string
fmt.Scan(&nroStr)
nro, err := strconv.Atoi(nroStr)
if (err != nil) {
return;
}
wg := sync.WaitGroup{}
nros := make([]int, 0, nro)
for i := 0; i < nro; i++ {
nros = append(nros,rand.Intn(10*nro))
}
if nro > 4 {
quart := int(math.RoundToEven(float64(nro) / 4.0))
wg.Add(4)
for i:=0; i < 3; i++ {
start := (i * quart)
end := (((i + 1) * quart))
go sortNros(nros[start:end], &wg)
}
go sortNros(nros[(3 * quart) : nro], &wg)
} else {
wg.Add(1)
go sortNros(nros, &wg)
}
wg.Wait()
fmt.Println(nros)
}
func sortNros(nros []int, wg *sync.WaitGroup) {
sort.Ints(nros)
wg.Done()
}