英文:
golang - deadlock with gorutine
问题
下面的代码是将一个值放入通道中,并打印出与放入的值相同数量的值。我期望它能正常工作,但是出现了错误。
package main
import (
"fmt"
"time"
)
func main() {
var ch chan int
for i := 0; i < 3; i++ {
go func(idx int) {
ch <- (idx + 1) * 2
}(i)
}
fmt.Println("result:", <-ch)
fmt.Println("result:", <-ch)
fmt.Println("result:", <-ch)
//do other work
time.Sleep(2 * time.Second)
}
在 playground 上进行了测试 - https://go.dev/play/p/FFmoSMheNfu
英文:
The code below is a code that puts a value into a channel and receives and print as much as you put in. I expected it to work, but an error occurs.
package main
import (
"fmt"
"time"
)
func main() {
var ch chan int
for i := 0; i < 3; i++ {
go func(idx int) {
ch <- (idx + 1) * 2
}(i)
}
fmt.Println("result:", <-ch)
fmt.Println("result:", <-ch)
fmt.Println("result:", <-ch)
//do other work
time.Sleep(2 * time.Second)
}
Tested on playground - https://go.dev/play/p/FFmoSMheNfu
答案1
得分: 3
你正在使用一个空通道。类型声明是不够的,你需要使用 make 来初始化通道。
ch := make(chan int)
https://go.dev/play/p/L1ewulPDYlS
有一集的 justforfunc 解释了空通道的行为以及它们为什么有时候很有用。
英文:
You are using a nil channel. The type declaration is not enough, you need to use make to initialize the channel.
ch := make(chan int)
https://go.dev/play/p/L1ewulPDYlS
There is an episode of justforfunc which explains how nil channels behave and why they are useful sometimes.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论