登录
首页 >  Golang >  Go教程

Golang channel为什么不会阻塞的原因详解

来源:脚本之家

时间:2023-01-27 09:05:53 455浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Golang channel为什么不会阻塞的原因详解》,聊聊channel、阻塞,我们一起来看看吧!

正文

最近在学通道channel,发现一个简单的demo:

package main
import "fmt"
func main() {
    chanInt := make(chan int)
    go func() {
        chanInt <- 100
    }()
    res := <-chanInt
    fmt.Println(res)
}

输出结果是100,这个没有问题。但是之前在学goroutine的时候有看到过一个例子:

package main
import "fmt"
func hello() {
    fmt.Println("Hello Goroutine!")
}
func main() {
    go hello() // 启动另外一个goroutine去执行hello函数
    fmt.Println("main goroutine done!")
}

这个例子输出的只有:main goroutine done! 并没有Hello Goroutine!

看过解释:在程序启动时,Go程序就会为main()函数创建一个默认的goroutine。当main()函数返回的时候该goroutine就结束了,所有在main()函数中启动的goroutine会一同结束

那么这个解释放到第一个例子为什么不适用了?

ps:我得理解是:运行到res :=

然后就是关于阻塞的情况,比如我把第一个例子改一下:

package main
import (
    "fmt"
    "time"
)
func main() {
    chanInt := make(chan int)
    go func() {
        chanInt <- 100
    }()
    time.Sleep(10 * time.Second)
    res := <-chanInt
    fmt.Println(res)
}

多了time.Sleep(10 * time.Second)等待10秒钟,10秒后输出100,这个没有问题。

然后再看一个例子:

func main() {
    chanInt := make(chan int)
    chanInt <- 100
    res := <-chanInt
    fmt.Println(res)
}

这个例子就会死锁,阻塞在chanInt

以上就是《Golang channel为什么不会阻塞的原因详解》的详细内容,更多关于golang的资料请关注golang学习网公众号!

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