将一个通道的值循环到另一个通道

Loop values for one go channel to other

任何人都可以检查我的代码并检查我为什么会遇到死锁吗?

package main

import (
    "fmt"
    "sync"
)

func main() {

    myCh := make(chan int, 10)
    wg := &sync.WaitGroup{}

    wg.Add(10)

    // READ ONLY
    go func(ch <-chan int, wg *sync.WaitGroup) {
        value := <-myCh
        fmt.Println(value)
        wg.Done()
    }(myCh, wg)

    // send ONLY
    go func(ch chan<- int, wg *sync.WaitGroup) {
        for i := 0; i < 10; i++ {
            myCh <- i
        }
        wg.Done()
    }(myCh, wg)

    wg.Wait()
}

我想从 SEND CHANNEL 发送循环值,而 OTHER CHANNEL 应该只接收每次迭代的值。

您在 wg.Add(10) 中添加了 delta = 10,并且只调用了两次 wg.Done()。

您应该调用 wg.Add(2) 或调用 wg.Done() 十次。

现在主函数锁定在 wg.Wait() 并等待另外八个 wg.Done() 调用。

您的 reader go 例程在第一个收到数据后退出。您必须在其中包含一个 for 循环才能连续读取该频道。

其次,您不需要在外循环中调用 wg.Sync(),因为它也会减少等待组。

package main

import (
    "fmt"
    "sync"
)

func main() {
    myCh := make(chan int, 10)
    wg := &sync.WaitGroup{}
    
    wg.Add(10)
    
    // READ ONLY
    go func(ch <-chan int, wg *sync.WaitGroup) {
        for value := range myCh { // this loop will read the channel continously
            fmt.Println(value)
            wg.Done()
        }
    }(myCh, wg)
    
    // send ONLY
    go func(ch chan<- int, wg *sync.WaitGroup) {
        for i := 0; i < 10; i++ {
            myCh <- i
        }
        //      wg.Done() <- This not needed here
    }(myCh, wg)
    
    wg.Wait()
    fmt.Println("DONE")
}