Go十大常见错误第4篇:for/switch和for/select做break操作的注意事项

105 阅读1分钟

前言

这是Go十大常见错误系列的第4篇:for/switch和for/select做break操作退出的注意事项。素材来源于Go布道者,现Docker公司资深工程师Teiva Harsanyi

本文涉及的源代码全部开源在:Go十大常见错误源代码,欢迎大家关注公众号,及时获取本系列最新更新。

场景

案例1

大家看看下面这段代码:

for {  switch f() {  case true:    break  case false:    // Do something  }}

如果函数调用f()返回的结果是true,进入到case true分支,会发生什么?会退出for循环么?

答案是:只退出了switch语句,并不会退出for循环,所以break后又继续执行for循环里的代码。

案例2

再看下面这段代码

for {
  select {
  case <-ch:
  // Do something
  case <-ctx.Done():
    break
  }
}

同样地,如果执行了break语句,退出的只是select语句块,并不会退出for循环。

那在上面2种场景里,如何退出for循环呢?

可以结合label和break进行实现。

loop:  for {
    select {
    case <-ch:
    // Do something
    case <-ctx.Done():
      break loop
    }
  }

对于上面的代码,loop是一个label,break loop如果执行了就会退出for循环。

推荐阅读

开源地址

文章和示例代码开源在GitHub: Go语言初级、中级和高级教程

公众号:coding进阶。

个人网站:Jincheng's Blog

知乎:无忌

本文正在参加技术专题18期-聊聊Go语言框架

References