Как сказал Энди в комментариях, вы выйдете из функции get
только тогда, когда все входные данные получены и канал закрыт. Как вы знаете, нужно получить пять вещей, в цикле которых может быть похожий цикл for
:
func main() {
intChan := make(chan int)
wg := sync.WaitGroup{}
for i := 0; i < 5; i++ {
wg.Add(1)
go send(intChan, i, &wg)
}
wg.Add(1)
go get(intChan, &wg)
wg.Wait()
close(intChan)
}
func send(c chan int, index int, wg *sync.WaitGroup) {
defer func() {
wg.Done()
}()
c <- index
}
func get(c chan int, wg *sync.WaitGroup) {
defer func() {
wg.Done()
}()
for i := 0; i < 5; i++ {
input := <- c
fmt.Printf("%d\n", input)
}
}
https://play.golang.org/p/CB8HUKPBu2I
Если вы хотите придерживаться диапазона по каналу, вам придется закрыть его после отправки всех сообщений, что я и сделал бы, добавив вторую группу ожидания:
func main() {
intChan := make(chan int)
allSent := sync.WaitGroup{}
for i := 0; i < 5; i++ {
allSent.Add(1)
go send(intChan, i, &allSent)
}
allReceived := sync.WaitGroup{}
allReceived.Add(1)
go get(intChan, &allReceived)
allSent.Wait()
close(intChan)
allReceived.Wait()
}
func send(c chan int, index int, wg *sync.WaitGroup) {
defer func() {
wg.Done()
}()
c <- index
}
func get(c chan int, wg *sync.WaitGroup) {
defer func() {
wg.Done()
}()
for i := range c {
fmt.Printf("%d\n", i)
}
}
https://play.golang.org/p/svFVrBdwmAc