在3个代码片段中,具有在本地范围声明的通道的代码片段有效,其他代码片段会产生死锁问题,这里前面回答的SO问题之一说尽量避免在全局范围内声明通道。我检查了官方文档,但我没有找到任何解释。
为什么全局范围通道在我没有阻止通道发送和接收时出现错误?为什么我在这里遇到死锁问题?
在范围和初始化方面与 Except 有何不同?make(chan int)var myChan chan int
任何人都可以解释和建议更好的文章/文档/链接/ pdf,以有效地使用Go中的通道(并实现并发)?
(为简洁起见,导入和“包主”从片段中省略)
// 1. channel declared in global scope
var c chan int
func main(){
go send()
fmt.Println(<-c)
}
func send(){
c <- 42
}
//output: fatal error: all goroutines are asleep - deadlock!
// 2. channel declared in global scope + sending channel to goroutine
var c chan int
func main(){
go send(c)
fmt.Println(<-c)
}
func send(c chan int){
c <- 42
}
//output: fatal error: all goroutines are asleep - deadlock!
// 3. using channel as local scope and sharing it with goroutine
func main(){
c := make(chan int)
go send(c)
fmt.Println(<-c)
}
func send(c chan int){
c <- 42
}
www说
倚天杖
随时随地看视频慕课网APP
相关分类