应该从 slice 中获取所有值,而最终不会出现死锁。当我不使用waitGroups时,我不会出现死锁错误。
是我用来代替waitGroup的东西,它帮助了

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

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

    a := []int{1, 3, 10, 8, 15, 23}

    wg.Add(len(a))

    go func(i []int) {
        for _, v := range i {
            c <- v
        }
    }(a)

    go Print(c)
    wg.Wait()
}

func Print(c chan int) {
    for v := range c {
        fmt.Println(v)
    }
    wg.Done()
    close(c)
}

最佳答案

您对同步机制感到困惑。关键是要同步异步工作程序。不是要处理的元素数量。

写操作结束后您没有关闭 channel ,但是读操作应该已经结束之后。错了

您正在使生产者和消费者都异步。这有点奇怪。由于您已经在main中拥有一个线程,因此可以利用它来启动虚假例程。

修复后代码的一些变化

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

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

    a := []int{1, 3, 10, 8, 15, 23}

    wg.Add(1) // one async worker
    go Print(c) // ensure the worker is started upfront

    for _, v := range a {
        c <- v // write the data
    }
    close(c) //then close

    wg.Wait()
    fmt.Println("done")
}

func Print(c chan int) {
    for v := range c { // the loop will break because the channel is closed.
        fmt.Println(v)
    }
    wg.Done()
}

您也可以在没有任何 WaitGroup 的情况下进行构建。
package main

import (
    "fmt"
)

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

    a := []int{1, 3, 10, 8, 15, 23}

    go func() {
        for _, v := range a {
            c <- v // write the data
        }
        close(c) //then close
    }()

    for v := range c { // the loop will break because the channel is closed.
        fmt.Println(v)
    }
    fmt.Println("done")
}

10-06 13:36