关于Go协程和通道的问题

huangapple go评论85阅读模式
英文:

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 (
	&quot;fmt&quot;
)

func main() {

	mychannel := make(chan int)
	go takeChn(mychannel)

	fmt.Println(&quot;length&quot;, len(mychannel))

	for res := range mychannel {
		fmt.Println(&quot;firstFunc&quot;, res, len(mychannel))

	}

}

func takeChn(c chan int) {

	for i := 0; i &lt; 10; i++ {
		c &lt;- (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 (
	&quot;fmt&quot;
)

func main() {

	mychannel := make(chan int)
	go takeChn(mychannel)

	fmt.Println(&quot;length&quot;, len(mychannel))

	for res := range mychannel {
		fmt.Println(&quot;firstFunc&quot;, res, len(mychannel))

	}

}

func takeChn(c chan int) {

	for i := 0; i &lt; 10; i++ {
		c &lt;- (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

huangapple
  • 本文由 发表于 2021年8月2日 03:10:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/68613583.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定