登录
首页 >  Golang >  Go问答

为何只能通过 goroutine 才能使其正常运行?

来源:stackoverflow

时间:2024-02-18 19:48:17 316浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《为何只能通过 goroutine 才能使其正常运行?》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我不是 100% 清楚为什么我的代码不起作用

package main
 
import (
    "fmt"
    "sync"
)
 
//var wg sync.WaitGroup
 
func main() {
 
    c := make(chan int)
    send(c)
    receive(c)
}
 
func send(c chan<- int) {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            for j := 0; j < 10; j++ {
                c <- j
            }
            wg.Done()
        }()
    }
 
    wg.Wait()
    close(c)
}
 
func receive(c <-chan int) {
    for v := range c {
        fmt.Println(v)
    }
}

如果我把go放在发送之前,它就可以正常工作。但我认为在发送中等待意味着程序将在那里等待,直到该函数中创建的 go 例程完成,并且只有在它们全部完成后才会转到接收函数,因此通道已填充?


正确答案


通道未缓冲。只有在另一个 goroutine 中从该通道读取数据时,对无缓冲通道的写入才会完成。因此,在 send 中创建的所有 goroutine 都陷入等待写入通道的状态,永远不会到达 wg.Done,因此 wg.Wait 无限期地等待。当你将 send 放在单独的 goroutine 中时,receive 可以运行,从而从通道中读取数据,释放等待的 goroutine。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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