设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间15 现在时间15 缓存数据 安河桥上没有追光者 童话镇里没有温柔乡 贝加尔湖畔没有化身孤岛的鲸 我的世界也不会再有你.

安河桥上没有追光者 童话镇里没有温柔乡 贝加尔湖畔没有化身孤岛的鲸 我的世界也不会再有你. -- 余味

查看: 1172|回复: 3

golang 跳出for循环操作

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
26
主题
22
精华
0
金钱
80
积分
48
注册时间
2023-10-3
最后登录
2025-5-31

发表于 2023-10-18 21:05:09 | 显示全部楼层 |阅读模式
执行以下代码,发现无法跳出for循环:
  1. func SelectTest() {
  2. i := 0
  3. for {
  4. select {
  5. case <-time.After(time.Second * time.Duration(2)):
  6. i++
  7. if i == 5 {
  8. fmt.Println("跳出for循环")
  9. }
  10. }
  11. fmt.Println("for循环内 i=", i)
  12. }
  13. fmt.Println("for循环外")
  14. }
复制代码
解决办法有两个:
1.使用break:
  1. func SelectTest() {
  2. i := 0
  3. Loop:
  4. for {
  5. select {
  6. case <-time.After(time.Second * time.Duration(2)):
  7. i++
  8. if i == 5 {
  9. fmt.Println("跳出for循环")
  10. break Loop
  11. }
  12. }
  13. fmt.Println("for循环内 i=", i)
  14. }
  15. fmt.Println("for循环外")
  16. }
复制代码
2.使用goto:
  1. func SelectTest() {
  2. i := 0
  3. for {
  4. select {
  5. case <-time.After(time.Second * time.Duration(2)):
  6. i++
  7. if i == 5 {
  8. fmt.Println("跳出for循环")
  9. goto Loop
  10. }
  11. }
  12. fmt.Println("for循环内 i=", i)
  13. }
  14. Loop:
  15. fmt.Println("for循环外")
  16. }
复制代码
分析:
使用break lable 和 goto lable 都能跳出for循环;不同之处在于:break标签只能用于for循环,且标签位于for循环前面,goto是指跳转到指定标签处
补充:golang跳出for select 循环
通常在for循环中,使用break可以跳出循环,但是注意在go语言中,for select配合时,break并不能跳出循环。
  1. func testSelectFor(chExit chan bool){
  2. for {
  3. select {
  4. case v, ok := <-chExit:
  5. if !ok {
  6. fmt.Println("close channel 1", v)
  7. break
  8. }
  9. fmt.Println("ch1 val =", v)
  10. }
  11. }
  12. fmt.Println("exit testSelectFor")
  13. }
复制代码
如下调用:
  1. //尝试2 select for 跳出循环
  2. c := make(chan bool)
  3. go testSelectFor(c)

  4. c <- true
  5. c <- false
  6. close(c)

  7. time.Sleep(time.Duration(2) * time.Second)
复制代码
运行结果如下,可以看到break无法跳出循环:
  1. ...
  2. close channel 1 false
  3. close channel 1 false
  4. close channel 1 false
  5. close channel 1 false
  6. ...
复制代码
了解决这个问题,需要设置标签,break 标签或goto 便签即可跳出循环,如下两种方法均可。
  1. func testSelectFor2(chExit chan bool){
  2. EXIT:
  3. for {
  4. select {
  5. case v, ok := <-chExit:
  6. if !ok {
  7. fmt.Println("close channel 2", v)
  8. break EXIT//goto EXIT2
  9. }

  10. fmt.Println("ch2 val =", v)
  11. }
  12. }
  13. //EXIT2:
  14. fmt.Println("exit testSelectFor2")
  15. }
复制代码
同样调用,输出结果如下:
  1. ch2 val = true
  2. ch2 val = false
  3. close channel 2 false
  4. exit testSelectFor2
复制代码
以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。如有错误或未考虑完全的地方,望不吝赐教。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:26
  • 打卡月天数:0
  • 打卡总奖励:337
  • 最近打卡:2025-06-28 07:17:53
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
383
积分
56
注册时间
2022-12-30
最后登录
2025-6-28

发表于 2024-10-27 05:35:43 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:22
  • 打卡月天数:0
  • 打卡总奖励:293
  • 最近打卡:2025-04-19 21:09:50
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
337
积分
48
注册时间
2022-12-31
最后登录
2025-4-19

发表于 2025-2-16 14:38:50 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2025-4-1 08:15:36 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表