{ "@context": "https://schema.org", "@type": "Article", "headline": "Go 缓冲通道的表现是否符合我的预期?", "datePublished": "2024-03-10T12:00:26", "dateModified": "2024-03-10T12:00:26", "description": "学习Golang要努力,但是不要急!今天的这篇文章《Go 缓冲通道的表现是否符合我的预期?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!问题内容我试图了解缓冲通道的工作原理并为其编写代码片段package mainimport ( fmt)func squares(c chan int) { for i := 0; i < 4; i++ { num := <-c fmt.printl", "publisher": { "@type": "Organization", "name": "Golang学习网", "url": "https://m.17golang.com" }, "mainEntityOfPage": { "@type": "WebPage", "@id": "https://m.17golang.com/article/107103.html" } }
登录
首页 >  Golang >  Go问答

Go 缓冲通道的表现是否符合我的预期?

来源:stackoverflow

时间:2024-03-10 12:00:26 436浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《Go 缓冲通道的表现是否符合我的预期?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我试图了解缓冲通道的工作原理并为其编写代码片段

package main

import (
    "fmt"
)

func squares(c chan int) {
    for i := 0; i < 4; i++ {
        num := <-c
        fmt.println(num * num)
    }
}

func main() {
    fmt.println("main() started")
    c := make(chan int, 3)
    
        go squares(c)

    c <- 1
    c <- 2
    c <- 3
    c <- 4 // blocks here

    fmt.println("main() stopped")
}

按照我预期程序的行为方式,主 goroutine 启动并持续到 c<-4,此时它被阻塞,控制权转到 square goroutine(因为缓冲区容量为 3)。 squares goroutine 中的循环一直持续到第四次迭代,此时通道为空。空通道上的读取操作会被阻塞,因此控制权会返回到主 goroutine。此时,对通道(c<-4)的写入操作被执行,我们打印“main()已停止”,程序结束。

意思是我期望的输出是,

main() started
1
4
9
main() stopped

但是我得到了输出,

main() started
1
4
9
16
main() stopped
如何?我是否遗漏了渠道到底如何运作的一些信息?

正确答案


渠道不是这样运作的。

Goroutines 并发运行。这意味着当一个 Goroutine 发送到缓冲通道时,另一个等待从该通道接收的 Goroutine 可以立即接收它。它不会等待通道填满。

至于程序的结束,当你将最后一个数字发送到通道时,不能保证 goroutine 会在程序结束之前拾取它并打印输出,因为你没有等待 goroutine完全的。因此,幸运的是,它运行并打印输出。还会有其他执行不会发生这种情况,并且程序会在 goroutine 打印输出之前终止。

今天关于《Go 缓冲通道的表现是否符合我的预期?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>