我是 Go 的新手,也在线程“throw: all goroutines are sleep”上看了一点,但我仍然想知道为什么这段代码会死锁。我相信我在 namesInDir 中放了一个数字,之后应该可以打印出来。似乎我无法将号码添加到频道 - 这让我感到困惑。任何人都可以帮助我?type uniprot struct{ namesInDir chan int}func main(){u := uniprot{}u.namesInDir = make(chan int)u.namesInDir <- 1//u.readFilenames(os.Args[1])u.printName()} func (u* uniprot) printName(){ name := <-u.namesInDir fmt.Println(name)}我得到了一些建议,我可以通过缓冲频道来作弊。为什么这不起作用?u.namesInDir = make(chan int, 100)u.namesInDir <- 1for i := 0; i < 10; i++ { go u.printName()}
1 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
缓冲通道的工作原理是这样的。
没有缓冲区的通道会阻塞发送方,直到接收方获取该值。在您的原始示例中,您只有一个 go 例程,因此当您发送整数时,所有 go 例程都会被阻止。缓冲区克服了这一点。或者运行两个 go 例程 - 一个发送和一个接收。
package main
import "fmt"
type uniprot struct {
namesInDir chan int
}
func (u *uniprot) printName() {
name := <-u.namesInDir
fmt.Println(name)
}
func main() {
u := uniprot{}
u.namesInDir = make(chan int, 1) // Buffer added here
u.namesInDir <- 1
//u.readFilenames(os.Args[1])
u.printName()
}
- 1 回答
- 0 关注
- 172 浏览
添加回答
举报
0/150
提交
取消