通过示例深度理解Go channel range

 更新时间:2023年05月25日 09:26:20   作者:goper  
这篇文章主要为大家介绍了Go channel range使用示例深度理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

我们来看下两端代码:

代码段1

func main() {
    channels := make([]chan int, 10) 
    for i := 0; i < 10; i++ {
         go func(ch chan int) {
          time.Sleep(time.Second)
          ch <- 1 
         }(channels[i])
    }
    for ch := range channels { 
    fmt.Println("Routine ", ch, " quit!")
    }
    fmt.Println("结束")
}

猜想下这上面会打印什么结果。

代码段2

func main() {
    ch := make(chan int, 10)
    for i := 0; i < 10; i++ {
        go func() {
            ch <- i
        }()
    }
    for range ch {
        <-ch
    }
    fmt.Println(1111)
}

猜想下代码2会打印什么结果。

自己可以运行下,

代码段1会正常运行, 代码段2会死锁, 纳尼,不一样吧,的确就是不一样。

请注意:代码段1 channels 是一个切片类型哦。

总结一下

channel 支持 for range 的方式进行遍历,需要注意两个细节。

1.在遍历时,如果 channel 没有关闭,则回出现 deadlock 的错误。

2.在遍历时,如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。

3.对于nil channel,无论收发都会被阻塞。

4.写完 chan 之后一定要关闭close chan,否则主协程读的时候,会发生被阻塞。

5.已关闭的Channel(有缓冲的),如果继续读数据,得到的是零值(对于int,就是0), 如果没有关闭,读不到数据了。

  • select语句中除default外,每个case操作一个channel,要么读要么写。
  • select语句中除default外,各case执行顺序是随机的。
  • select语句中如果没有default语句, 则会阻塞等待任一case。
  • select语句中读操作要判断是否成功读取,关闭的channel也可以读取.

遍历 chan 与 遍历切片类型是不一样的。

以上就是Go channel range使用示例深度理解的详细内容,更多关于Go channel range的资料请关注脚本之家其它相关文章!

相关文章

  • Go web中cookie值安全securecookie库使用原理

    Go web中cookie值安全securecookie库使用原理

    这篇文章主要为大家介绍了Go web中cookie值安全securecookie库使用及实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • go GCM gin中间件的加密解密文件流处理

    go GCM gin中间件的加密解密文件流处理

    这篇文章主要介绍了go语言 GCM加密解密,gin中间件的加密解密及文件流处理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-05-05
  • GO语言gin框架实现管理员认证登陆接口

    GO语言gin框架实现管理员认证登陆接口

    这篇文章主要介绍了GO语言gin框架实现管理员认证登陆接口,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Go语言运算符案例讲解

    Go语言运算符案例讲解

    这篇文章主要介绍了Go语言运算符案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Go切片导致rand.Shuffle产生重复数据的原因与解决方案

    Go切片导致rand.Shuffle产生重复数据的原因与解决方案

    在 Go 语言的实际开发中,切片(slice)是一种非常灵活的数据结构,然而,由于其底层数据共享的特性,在某些情况下可能会导致意想不到的 Bug,本文将详细分析 rand.Shuffle 之后,切片中的数据出现重复的问题,探讨其根本原因,并给出最佳解决方案,需要的朋友可以参考下
    2025-02-02
  • 一起来用GoLand开发第一个Go程序

    一起来用GoLand开发第一个Go程序

    当您在编辑器中工作时GoLand 会分析您的代码,寻找优化方法,并检测潜在和实际问题,下面这篇文章主要给大家介绍了关于用GoLand开发第一个Go程序的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Go语言利用泛型封装常见的Map操作

    Go语言利用泛型封装常见的Map操作

    Go 语言在 1.18 版本中引入了泛型,这是 Go 语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感兴趣的可以了解下
    2025-02-02
  • Go语言实现一个简单生产者消费者模型

    Go语言实现一个简单生产者消费者模型

    本文主要介绍了Go语言实现一个简单生产者消费者模型,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Go channel实现原理分析

    Go channel实现原理分析

    Channel是go语言内置的一个非常重要的特性,也是go并发编程的两大基石之一,下面这篇文章主要给大家介绍了关于Go中channel的相关资料,需要的朋友可以参考下
    2023-04-04
  • golang 对私有函数进行单元测试的实例

    golang 对私有函数进行单元测试的实例

    这篇文章主要介绍了golang 对私有函数进行单元测试的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05

最新评论