在golang通道中没有接收到数据。

huangapple go评论151阅读模式
英文:

Not receiving in the golang channel

问题

在下面的示例中,我正在将“ping”发送到匿名的go例程中的'mq'字符串通道,并尝试在四个dequeue() goroutine中接收这些字符串,不确定为什么它不打印任何内容。

$ cat channels2.go 
...
var mq chan string

func main() {
    mq = make(chan string)
    for i := 0; i < 4; i++ {
        go dequeue()
    }
    go func() {
        for i := 0; ; i++ {
            mq <- "ping" 
        }
    }()
}

func dequeue() {
    for m := range mq {
        fmt.Println(m)
    }
}
$ go run channels2.go
$

在上述代码中,创建了一个名为mq的字符串通道。然后,在main()函数中,使用make()函数初始化了该通道。接下来,使用for循环创建了四个dequeue() goroutine。然后,使用匿名的go例程向通道中不断发送字符串"ping"。最后,在dequeue()函数中,使用range关键字从通道中接收字符串并打印出来。

根据你提供的代码,我无法确定为什么没有打印任何内容。可能是因为程序在打印之前就退出了,或者可能是因为通道中的数据还没有被接收到。你可以检查一下程序的其他部分,看看是否有其他原因导致没有打印任何内容。

英文:

In the example below I am sending "ping"s to 'mq' string channel in anonymous go routine and try to receive these strings in four dequeue() goroutines , not sure why it doesn't print anything

    $ cat channels2.go 
    ...
    var mq chan string
    
    func main() {
            mq = make(chan string)
            for i := 0; i &lt; 4; i++ {
                    go dequeue()
            }
            go func() {
                    for i := 0; ; i++ {
                            mq &lt;- &quot;ping&quot; 
                            }
            }()
    
    }
    
    func dequeue() {
            for m := range mq {
                    fmt.Println(m)
            }
    }
   $ go run channels2.go
   $

答案1

得分: 4

一旦主 goroutine 返回,程序就会退出。因此,你需要确保不要提前从 main 函数返回。一种方法是在主 goroutine 中执行向通道写入的循环:

var mq chan string

func main() {
    mq = make(chan string)
    for i := 0; i < 4; i++ {
        go dequeue()
    }
    for {
        mq <- "ping"
    }
}

func dequeue() {
    for m := range mq {
        fmt.Println(m)
    }
}
英文:

As soon as the main goroutine returns, the program exits. So you need to make sure to not return from main early. One way to do this is to execute the write-loop to the channel in the main goroutine:

var mq chan string

func main() {
        mq = make(chan string)
        for i := 0; i &lt; 4; i++ {
                go dequeue()
        }
        for {
            mq &lt;- &quot;ping&quot; 
        }
}

func dequeue() {
        for m := range mq {
                fmt.Println(m)
        }
}

huangapple
  • 本文由 发表于 2017年8月25日 01:17:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/45867532.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定