我正在尝试创建一个简单的程序来学习Go中的频道.但我遇到了死锁错误,我无法弄明白
package main
import (
"fmt"
"time"
)
func printer(c chan int) {
for i := 0; i < 10; i++ {
c <- i
time.Sleep(time.Second)
}
}
func reciever(c chan int) {
for {
recievedMsg := <-c
fmt.Println(recievedMsg)
}
}
func main() {
newChanel := make(chan int)
printer(newChanel)
reciever(newChanel)
}
Run Code Online (Sandbox Code Playgroud)
我最初的想法是关于睡眠功能,但即使我不包括这个,我仍然遇到这个错误并退出消息.任何人都可以提供一些如何解决这个问题的提示吗?
提前致谢
您需要两个执行线程,因为现在reciever
无法调用该函数,因为您永远不会离开该printer
函数.你需要在一个单独的goroutine上执行其中一个.
您还应该close
使用通道并range
在循环中使用运算符,以便在通道关闭时结束.
所以我建议你这个代码:
func printer(c chan int) {
for i := 0; i < 10; i++ {
c <- i
time.Sleep(time.Second)
}
close(c)
}
func reciever(c chan int) {
for recievedMsg := range c {
fmt.Println(recievedMsg)
}
}
func main() {
newChanel := make(chan int)
go printer(newChanel)
reciever(newChanel)
}
Run Code Online (Sandbox Code Playgroud)