golang 跳出for循环操作

 更新时间:2020年12月15日 10:18:33   作者:陈永坤  
这篇文章主要介绍了golang 跳出for循环操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

执行以下代码,发现无法跳出for循环:

func SelectTest() {
 i := 0
 for {
 select {
 case <-time.After(time.Second * time.Duration(2)):
 i++
 if i == 5 {
 fmt.Println("跳出for循环")
 }
 }
 fmt.Println("for循环内 i=", i)
 }
 fmt.Println("for循环外")
}

解决办法有两个:

1.使用break:

func SelectTest() {
 i := 0
Loop:
 for {
 select {
 case <-time.After(time.Second * time.Duration(2)):
 i++
 if i == 5 {
 fmt.Println("跳出for循环")
 break Loop
 }
 }
 fmt.Println("for循环内 i=", i)
 }
 fmt.Println("for循环外")
}

2.使用goto:

func SelectTest() {
 i := 0
 for {
 select {
 case <-time.After(time.Second * time.Duration(2)):
 i++
 if i == 5 {
 fmt.Println("跳出for循环")
 goto Loop
 }
 }
 fmt.Println("for循环内 i=", i)
 }
Loop:
 fmt.Println("for循环外")
}

分析:

使用break lable 和 goto lable 都能跳出for循环;不同之处在于:break标签只能用于for循环,且标签位于for循环前面,goto是指跳转到指定标签处

补充:golang跳出for select 循环

通常在for循环中,使用break可以跳出循环,但是注意在go语言中,for select配合时,break并不能跳出循环。

func testSelectFor(chExit chan bool){
 for {
 select {
 case v, ok := <-chExit:
 if !ok {
 fmt.Println("close channel 1", v)
 break
 }
 fmt.Println("ch1 val =", v)
 }
 }
 fmt.Println("exit testSelectFor")
}

如下调用:

//尝试2 select for 跳出循环
c := make(chan bool)
go testSelectFor(c)
 
c <- true
c <- false
close(c)
 
time.Sleep(time.Duration(2) * time.Second)

运行结果如下,可以看到break无法跳出循环:

...
close channel 1 false
close channel 1 false
close channel 1 false
close channel 1 false
...

了解决这个问题,需要设置标签,break 标签或goto 便签即可跳出循环,如下两种方法均可。

func testSelectFor2(chExit chan bool){
 EXIT:
 for {
 select {
 case v, ok := <-chExit:
 if !ok {
 fmt.Println("close channel 2", v)
 break EXIT//goto EXIT2
 }
 
 fmt.Println("ch2 val =", v)
 }
 }
 //EXIT2:
 fmt.Println("exit testSelectFor2")
}

同样调用,输出结果如下:

ch2 val = true
ch2 val = false
close channel 2 false
exit testSelectFor2

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • 十个Go map面试常考问题合集

    十个Go map面试常考问题合集

    go面试中,map相关知识点问的比较多,这篇文章主要为大家整理归纳了10个常考的问题,文中的示例代码讲解详细,希望对大家有一定的帮助
    2023-07-07
  • goland 设置注释模板的过程图文详解

    goland 设置注释模板的过程图文详解

    这篇文章主要介绍了goland 设置注释模板的过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-12-12
  • Go获取与设置环境变量的方法详解

    Go获取与设置环境变量的方法详解

    go环境变量的配置其实说真的说难也难,说不难也不难,只要配置成功过一次以后后面都很简单,但是最好是要做好笔记,这篇文章主要给大家介绍了关于Go获取与设置环境变量的相关资料,需要的朋友可以参考下
    2021-11-11
  • go的websocket实现原理与用法详解

    go的websocket实现原理与用法详解

    这篇文章主要介绍了go的websocket实现原理与用法,详细分析了websocket的功能、原理及Go语言实现websocket的相关技巧,需要的朋友可以参考下
    2016-07-07
  • 一文带你了解Golang中的缓冲区Buffer

    一文带你了解Golang中的缓冲区Buffer

    作为一种常见的数据结构,缓冲区(Buffer)在计算机科学中有着广泛的应用。这篇文章将详细介绍 Go 中 Buffer 的用法,从多个方面介绍其特性和应用场景,需要的可以参考一下
    2023-05-05
  • Go语言实现简单Web服务器的方法

    Go语言实现简单Web服务器的方法

    这篇文章主要介绍了Go语言实现简单Web服务器的方法,实例分析了Web服务器的实现原理与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • golang字符串转64位整数的示例代码

    golang字符串转64位整数的示例代码

    这篇文章主要介绍了golang字符串转64位整数,在Go语言中,可以使用strconv包中的ParseInt函数将字符串转换为64位整数,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • go下载指定版本的依赖包图文详解

    go下载指定版本的依赖包图文详解

    由于依赖包的每个版本都有一个唯一的目录,所以在多项目场景中需要使用同一个依赖包的多版本时才不会产生冲突,下面这篇文章主要给大家介绍了关于go下载指定版本的依赖包的相关资料,需要的朋友可以参考下
    2023-04-04
  • Golang泛型的使用方法详解

    Golang泛型的使用方法详解

    这篇文章主要介绍了Golang中泛型的使用,Go和Python语言不同,处理不同数据类型非常严格。如Python可以定义函数带两个数值类型并返回较大的数值,但可以不严格指定参数类型为float或integer
    2022-12-12
  • golang中slice扩容的具体实现

    golang中slice扩容的具体实现

    Go 语言中的切片扩容机制是 Go 运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣的可以了解一下
    2025-05-05

最新评论