为什么所有的goroutines都陷入僵局?

为什么所有的goroutines都陷入僵局?,go,Go,我是新来的,而且在线程“throw:allgoroutinesalleep”上看起来有点像,但我仍然想知道为什么这段代码会死锁。我相信我在namesInDir中输入了一个数字,之后应该可以打印出来。似乎我无法将号码添加到频道-这让我感到困惑。有人能帮我吗 type uniprot struct { namesInDir chan int } func main(){ u := uniprot{} u.namesInDir = make(chan int) u.namesInDir &

我是新来的,而且在线程“throw:allgoroutinesalleep”上看起来有点像,但我仍然想知道为什么这段代码会死锁。我相信我在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)
}
类型uniprot struct
{
纳森迪尔陈国际酒店
}
func main(){
u:=uniprot{}
u、 namesInDir=make(chan int)

u、 namesInDir缓冲通道有效

没有缓冲区的通道会阻止发送方,直到接收方获取该值。在原始示例中,只有一个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()
}
主程序包
输入“fmt”
类型uniprot struct{
纳森迪尔陈国际酒店
}
func(u*uniprot)打印名(){

name:=当您运行代码时会发生什么?谢谢tarrsalah,我起初没有找到您的帖子。我在您发布时正在阅读它。@emil。我得到一个致命错误:所有goroutine都处于休眠状态-死锁!即使有缓冲区,您也无法读取比您所写的更多的数据。如果您想读取十个整数,您需要将其中至少十个放入队列,ra与您目前所做的不止一个。这是正确的,但在通道中使用两个goroutine(如上所述)是很好的方式。通道的用途是作为goroutine之间的同步和通信原语。因此,尽管缓冲通道可以在单个goroutine中作为存储,但有更合适的方法来实现这一点。
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()
}