La mejor manera de usar sync.WaitGroup con función externa

Tengo algunos problemas con el siguiente código:

package main

import (
"fmt"
"sync"
)
// This program should go to 11, but sometimes it only prints 1 to 10.
func main() {
    ch := make(chan int)
    var wg sync.WaitGroup
    wg.Add(2)
    go Print(ch, wg) //
    go func(){

        for i := 1; i <= 11; i++ {
            ch <- i
        }

        close(ch) 
        defer wg.Done()


    }()

    wg.Wait() //deadlock here
}

// Print prints all numbers sent on the channel.
// The function returns when the channel is closed.
func Print(ch <-chan int, wg sync.WaitGroup) {
    for n := range ch { // reads from channel until it's closed
        fmt.Println(n)
    }
    defer wg.Done()
}

Tengo un punto muerto en el lugar especificado. He intentado configurarwg.Add(1) en lugar de 2 y resuelve mi problema. Creo que no estoy enviando el canal con éxito como argumento paraPrinter función. ¿Hay una manera de hacerlo? De lo contrario, una solución a mi problema es reemplazar elgo Print(ch, wg)linea con:

go func() {
Print(ch)
defer wg.Done()
}

y cambiando elPrinter función para:

func Print(ch <-chan int) {
    for n := range ch { // reads from channel until it's closed
        fmt.Println(n)
    }

}

¿Cuál es la mejor solución?

Respuestas a la pregunta(2)

Su respuesta a la pregunta