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

作为一个刚接触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:
}
如上,成功从坑中走出。

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...