¿Cómo recopilar valores de N goroutines ejecutados en un orden específico?

A continuación se muestra una estructura de tipo Stuff. Tiene tres ints. UNANumber, esDouble y esPower. Supongamos que calcular el doble y la potencia de una lista dada de entradas es un cálculo costoso.

type Stuff struct {
    Number int
    Double int
    Power  int
}

func main() {
    nums := []int{2, 3, 4} // given numbers
    stuff := []Stuff{}     // struct of stuff with transformed ints

    double := make(chan int)
    power := make(chan int)

    for _, i := range nums {
        go doubleNumber(i, double)
        go powerNumber(i, power)
    }

    // How do I get the values back in the right order?

    fmt.Println(stuff)
}

func doubleNumber(i int, c chan int) {
    c <- i + i
}

func powerNumber(i int, c chan int) {
    c <- i * i
}

El resultado defmt.Println(stuff) debería ser lo mismo que si se inicializaran cosas como:

stuff := []Stuff{
    {Number: 2, Double: 4, Power: 4}
    {Number: 3, Double: 6, Power: 9}
    {Number: 4, Double: 8, Power: 16}
}

Sé que puedo usar<- double y<- power para recopilar valores de los canales, pero no sé qué dobles / potencias pertenecen a qué números.

Respuestas a la pregunta(2)

Su respuesta a la pregunta