关于go:Go十大常见错误第4篇forswitch和forselect做break操作的注意事项

前言

这是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循环。

举荐浏览

  • Go十大常见谬误第1篇:未知枚举值
  • Go十大常见谬误第2篇:benchmark性能测试的坑
  • Go十大常见谬误第3篇:go指针的性能问题和内存逃逸
  • Go switch应用阐明
  • Go for/break应用阐明
  • Go select语义

开源地址

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

公众号:coding进阶。关注公众号能够获取最新Go面试题和技术栈。

集体网站:Jincheng’s Blog。

知乎:无忌。

福利

我为大家整顿了一份后端开发学习材料礼包,蕴含编程语言入门到进阶常识(Go、C++、Python)、后端开发技术栈、面试题等。

关注公众号「coding进阶」,发送音讯 backend 支付材料礼包,这份材料会不定期更新,退出我感觉有价值的材料。还能够发送音讯「进群」,和同行一起交流学习,答疑解惑。

References

  • https://itnext.io/the-top-10-…
  • https://github.com/jincheng9/…
  • https://github.com/jincheng9/…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理