跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • go 协程和 select 的知识点
未分類
24 11 月 2020

go 协程和 select 的知识点

go 协程和 select 的知识点

資深大佬 : xing393939 4

无缓存管道和缓存管道

先看看无缓存管道的例子:

 a := make(chan bool)  go func() {   log.Println("goroutine")   <-a  }()  a <- true 

这里主协程会等待子协程执行完,但是如果把第一行改成 a := make(chan bool, 1),那么主协程写完消息直接退出了,子协程没有机会执行(只有一个 cpu 时)。但是改成如下子协程又可以执行了:

 a := make(chan bool, 1)  go func() {   log.Println("goroutine")   <-a  }()  a <- true  a <- true 

管道关闭后,select 能一直接受 close 信号

 a := make(chan bool, 1)  go func() {   close(a)  }()  for {   select {   case _, ok := <-a:    log.Println(ok)   }  } 

而用 for range 是不能获取 close 信号的,如下:

 a := make(chan bool, 1)  go func() {   a <- true   close(a)  }()  for {   for v := range a {    log.Println(v)   }  }  

大佬有話說 (1)

  • 資深大佬 : user8341

    range 是循环到 chan 被关闭为止。当然如果一开始就是关闭的,循环就不执行。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具