Closing and ranging over go channels

Viewed 269

I'm new to Go and I am also kinda having a hard time reading the documentation. Can anyone help explain what is wrong with the code below

package main

import (
    "fmt"
)

func main() {
    c := make(chan int)

    for i := 0; i < 10; i++ {
        go func() {
            add(c)
        }()
    }
    close(c)

    for v := range c {
        fmt.Println(v)
    }
}

func add(c chan<- int) {
    c<-123
}
1 Answers

Based on the suggestion from icza :

package main

import (
    "fmt"
    "sync"
)

func main() {
    c := make(chan int)

    var wgConsumer sync.WaitGroup
    wgConsumer.Add(1)
    go func() {
        defer wgConsumer.Done()
        for v := range c {
            fmt.Println(v)
        }

    }()

    var wg sync.WaitGroup
    wg.Add(10)

    for i := 0; i < 10; i++ {
        go func() {
            add(c)
            defer wg.Done()
        }()

    }
    wg.Wait()
    close(c)

    wgConsumer.Wait()

}

func add(c chan<- int) {
    c <- 123
}

Output:

123
123
123
123
123
123
123
123
123
123
Related