首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通道缓冲器是如何在戈朗中工作的,当它们没有被使用时(在它们的范围内)和当它们被传递到goroutines时?

通道缓冲器是如何在戈朗中工作的,当它们没有被使用时(在它们的范围内)和当它们被传递到goroutines时?
EN

Stack Overflow用户
提问于 2018-12-17 12:10:44
回答 1查看 356关注 0票数 2

我绝对是戈朗的新手。我正在通过旅游学习,然后用我自己的理解实现想法。我对大猩猩有意见。我做了一个没有缓冲的频道,然后给那个频道发送了一个字符串。

代码语言:javascript
运行
复制
func main() {
    p := make(chan string)
    p <- "Hello goroutine"
    fmt.Println(<-p)
}

抛错

致命错误:所有的猩猩都睡着了-死锁!

我明白了,频道没有缓冲。(,这就是原因。对吧?)。

但是当我把p <- "Hello goroutine重构成一个

代码语言:javascript
运行
复制
func main() {
    p := make(chan string)
    go sendHello(p)
    fmt.Println(<-p)
}

func sendHello(p chan string) {
    p <- "Hello goroutine"
}

它没有问题。我读到,我们不需要在大多数情况下使用映射、切片和通道的指针来修改值。channel p,它通过一个具有独立缓冲区的副本传递给。我还是不能把我的头绕过去。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-17 12:27:26

请记住,频道有两个端,发送者和接收者。你的问题是执行的顺序。

在第一个示例中,当您使用一个未缓冲的通道时,通道需要一个接收方,而在发送Hello goroutine消息时没有接收方,并等待直到有一个接收方(缓冲通道不需要等待),并且执行永远不会到达下一行(即死锁)。

但是在第二个例子中,接收方被绑定到信道,然后执行发件人和接收方,并且发送方和接收方都不会停留在等待状态。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53814981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档