美文网首页
Go 语言中Select与for结合使用时可能会遇到的坑

Go 语言中Select与for结合使用时可能会遇到的坑

作者: 进击云原生 | 来源:发表于2018-09-11 16:07 被阅读46次

作为一个刚接触go编程的新鸟,是不是被它的某些新特性给吓到,尤其是之前已经习惯了C++的编程。对于Go语言,网上褒贬不一,有极力推崇的,如七牛的许式伟,其对go的评价极高,并预言Go的市场占有率会一直逐步上升,取代java,成为第一。也有极力贬低的,他们一般会网络上有各种博客帖子,详细的剖析了go的不妥之处。而我接触go这段时间之后,不得不说,它真的是一门很有意思的语言,为什么用有意思形容呢,借用一句装逼的话,存在即合理。go能够慢慢被国内国外的各大互联网公司用于服务器架构,它自有它的闪光之处,而至于有意思呢,就需要对它有兴趣的人慢慢去发现,(呃。。。。这个情景导入有点长,貌似有点跑偏)

好,言归正传,最近在用go开发项目的过程中突然发现一个坑,尤其是对于其它传统语言转来的人来说一不住注意就掉坑里了,话不多说,show you the code。


func test(){
    i := 0
    for {
        select {
        case <-time.After(time.Second * time.Duration(2)):
            i++
            if i == 5{
                fmt.Println("break now")
                break 
            }
            fmt.Println("inside the select: ")
        }
        fmt.Println("inside the for: ")
    }
}

执行后发现,什么?居然break不出去?后来查了一下资料发现,当for 和 select结合使用时,break语言是无法跳出for之外的,因此若要break出来,这里需要加一个标签,使用goto, 或者break 到具体的位置

解决方法一:使用golang中break的特性,在外层for加一个标签


func test(){
    i := 0
    ForEnd:
    for {
        select {
        case <-time.After(time.Second * time.Duration(2)):
            i++
            if i == 5{
                fmt.Println("break now")
                break ForEnd
            }
            fmt.Println("inside the select: ")
        }
        fmt.Println("inside the for: ")
    }
}

解决方法二: 使用goto直接跳出循环:

func test(){
    i := 0
 
    for {
        select {
        case <-time.After(time.Second * time.Duration(2)):
            i++
            if i == 5{
                fmt.Println("break now")
                goto ForEnd
            }
            fmt.Println("inside the select: ")
        }
        fmt.Println("inside the for: ")
    }
    ForEnd:
}

如上,成功从坑中走出。


转载自:
https://blog.csdn.net/u010511236/article/details/44850761

相关文章

  • Go 语言中Select与for结合使用时可能会遇到的坑

    作为一个刚接触go编程的新鸟,是不是被它的某些新特性给吓到,尤其是之前已经习惯了C++的编程。对于Go语言,网上褒...

  • 【golang】select关键字用法

    select是go语言中常用的一个关键字,其用法也一直被用作面试题来考核应聘者。今天,结合代码来分析下select...

  • TODO:Go语言goroutine和channel使用

    TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语...

  • Golang 需要避免踩的 50 个坑

    前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计...

  • Go 语言中的 go range 循环

    看了好多文章都发现了 go 语言中的 defer 和 go range 循环的坑点,但是很多文章都没有发现这一坑点...

  • Go语言指针

    Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。 接下来让我们来一步步学习 Go 语...

  • range迭代中的坑

    go语言中range的坑,代码如下 坑2: 为什么输出结果如此没规律: 希望有知道的朋友解答下!谢谢~~

  • Go的内存管理

    本文翻译自Memory Management in Go,介绍了Go语言中内存管理的相关概念。 所有的计算机程序语...

  • Go语言中for range的"坑"

    前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for ran...

  • ScrollView嵌套RecyclerView的几个坑

    当ScrollView与RecyclerView嵌套使用时遇到的几个坑 1.显示不全 使用RelativeLayo...

网友评论

      本文标题:Go 语言中Select与for结合使用时可能会遇到的坑

      本文链接:https://www.haomeiwen.com/subject/sbpugftx.html