我是Go的新手,也看了线程“抛出:所有goroutines都睡着了”,但我仍然想知道为什么这段代码死锁。我相信我在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 <- 1
for i := 0; i < 10; i++ {
go u.printName()
}
答案 0 :(得分:3)
缓冲频道有效like this。
没有缓冲区的通道会阻止发送方,直到接收方获取该值。在您的原始示例中,您只有一个例程,因此在发送整数时,所有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()
}