英文:
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 < 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
$
答案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 < 4; i++ {
go dequeue()
}
for {
mq <- "ping"
}
}
func dequeue() {
for m := range mq {
fmt.Println(m)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论