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

Golang 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 := <-chanInt这句会阻塞,直到协程写入通道后,就马上读取,继续执行打印语句。不知道理解的对不对?

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

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

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

然后再看一个例子:

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

这个例子就会死锁,阻塞在chanInt <- 100这句,发现没有接收者所以死锁了,这边不理解的是:睡眠10秒的时候,在这10秒里面为什么不会造成死锁?而最后一个例子一运行马上报死锁?更多关于Golang channel不会阻塞的资料请关注易知道(ezd.cc)其它相关文章!

推荐阅读

    golang代理怎么设置

    golang代理怎么设置,代理,请求,设置,语言,客户端,应用程序,Go语言(或称Golang)是一种广受欢迎的编程语言,尤其适用于网络编程。在创建Web应用程序

    什么是golang

    什么是golang,语言,执行,编程语言,机器语言,高级语言,运行,golang是一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;它可以在不损

    Golang之wait.Until 简单测试用例

    Golang之wait.Until 简单测试用例,结束,主程序,测试目的,验证wait.Until的用法 //测试wait.Until() 的用途package mainimport ( "fmt

    使用Golang实现简单Ping过程

    使用Golang实现简单Ping过程,报文,字节,摘要: Ping的基本原理是发送和接受ICMP请求回显报文,利用Go语言可以轻松实现这一过程,较之C/C++语言

    golang二进制读写文件-二进制文件

    golang二进制读写文件-二进制文件有些时候,我突然想知道MySQL的如何存储数据的.她是如何完整的获取某行的数据,并且获得每个字段的值.比如,我

    GoLang下载安装-bin文件安装

    GoLang下载安装-bin文件安装GoLang IDEA https://www.jetbrains.com/go/download/download-thanks.htmlgolang特性:Go原生支持并发(Concur

    Golang gRPC HTTP协议转换示例

    Golang gRPC HTTP协议转换示例gRPC HTTP协议转换
    正当有这个需求的时候,就看到了这个实现姿势。源自coreos的一篇博客,转载到了grpc官方

    Golang泛型的使用方法详解

    Golang泛型的使用方法详解目录1. 泛型是什么2. 泛型的简单使用2.1. 泛型示例2.2. 自定义泛型类型2.3. 调用带泛型的函数3. 自定义泛型类