网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。

go channel的常规用法

2020-06-10 04:12:15 admin 5787

循环获取channel

__

  1. func get(data chan int){
  2. for v,ok := range chan{
  3. if !ok{
  4. //channel 已经关闭
  5. break
  6. }
  7. // do something with v
  8. }
  9. }

如果需要停止使用channel,需要手动将channel关闭

__

  1. close (data)

关闭后的channel还能获取其中存在的数据,但是不能再增加数据。数据取完后ok值为false。

channel关闭的判断

__

  1. ch = make(chan int, 10)
  2. //....some code
  3. select{
  4. case r,ok := <- ch:
  5. if !ok {
  6. //通道已空 并且已经关闭
  7. }
  8. }

向有缓存的channel传数据,满了就停止,不阻塞

__

  1. ch = make(chan int, 10)
  2. Fill: //为循环设置tag
  3. for{
  4. select {
  5. case ch <- 1:
  6. default:
  7. break Fill
  8. }
  9. }

for循环必须设置tag,不然select中的break无法停止外部循环,会一直执行default,陷入死循环。

__

  1. //这段代码会陷入死循环中,每次都执行default
  2. for{
  3. select{
  4. case <- time.After(10*time.Second):
  5. default:
  6. break
  7. }
  8. }

超时的使用

__

  1. select {
  2. case job <- jobList
  3. case <- time.After(10 * time.Second):
  4. //10秒后做超时处理
  5. }

原文

转载文章,原文链接: go channel的常规用法

关键字词channelgo

分享到:

如需留言,请 登录,没有账号?请 注册

0 条评论 0 人参与

顶部 底部