英文:
issue with go routine and channel
问题
我正在学习Go语言的goroutine和channel。这是我在这个主题上尝试的一个基本程序,我遇到了一个错误:fatal error: all goroutines are asleep - deadlock!
,我还想知道为什么我的channel的长度为零。
package main
import (
"fmt"
)
func main() {
mychannel := make(chan int)
go takeChn(mychannel)
fmt.Println("length", len(mychannel))
for res := range mychannel {
fmt.Println("firstFunc", res, len(mychannel))
}
}
func takeChn(c chan int) {
for i := 0; i < 10; i++ {
c <- (i + 1)
}
}
我会尽快为您翻译这段代码。
英文:
I am learning go routines and channels,here is a basic program which i tried on the topic ,I am getting error that fatal error: all goroutines are asleep - deadlock!
and I also want to know why length of my channel is zero.
package main
import (
"fmt"
)
func main() {
mychannel := make(chan int)
go takeChn(mychannel)
fmt.Println("length", len(mychannel))
for res := range mychannel {
fmt.Println("firstFunc", res, len(mychannel))
}
}
func takeChn(c chan int) {
for i := 0; i < 10; i++ {
c <- (i + 1)
}
}
答案1
得分: 3
通道的长度为零,因为它是一个无缓冲通道。它不存储任何元素。
你的程序发生死锁,因为for循环永远不会终止。当通道关闭时,对通道的范围操作将终止,但你从未关闭通道。
如果在 goroutine 的末尾关闭通道,程序将不会发生死锁。
英文:
The length of the channel is zero, because it is an unbuffered channel. It does not store any elements.
Your program deadlocks because the for-loop never terminates. The range over the channel will terminate when the channel is closed, but you never close the channel.
If you close the channel at the end of the goroutine, the program will run without a deadlock.
答案2
得分: 0
根据Burak Serdar的输入修改代码,关闭通道:
package main
import (
"fmt"
)
func main() {
mychannel := make(chan int)
go takeChn(mychannel)
fmt.Println("长度", len(mychannel))
for res := range mychannel {
fmt.Println("第一个函数", res, len(mychannel))
}
}
func takeChn(c chan int) {
for i := 0; i < 10; i++ {
c <- (i + 1)
}
close(c)
}
输出:
长度 0
第一个函数 1 0
第一个函数 2 0
第一个函数 3 0
第一个函数 4 0
第一个函数 5 0
第一个函数 6 0
第一个函数 7 0
第一个函数 8 0
第一个函数 9 0
第一个函数 10 0
英文:
Modifying the code as per Burak Serdar's input by closing the channel
package main
import (
"fmt"
)
func main() {
mychannel := make(chan int)
go takeChn(mychannel)
fmt.Println("length", len(mychannel))
for res := range mychannel {
fmt.Println("firstFunc", res, len(mychannel))
}
}
func takeChn(c chan int) {
for i := 0; i < 10; i++ {
c <- (i + 1)
}
close(c)
}
Output:
length 0
firstFunc 1 0
firstFunc 2 0
firstFunc 3 0
firstFunc 4 0
firstFunc 5 0
firstFunc 6 0
firstFunc 7 0
firstFunc 8 0
firstFunc 9 0
firstFunc 10 0
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论