0

我是 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()
}
4

1 回答 1

3

缓冲通道的工作方式如下

没有缓冲区的通道会阻塞发送方,直到接收方获取该值。在您的原始示例中,您只有一个 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()
}
于 2013-09-28T17:29:47.010 回答