select case break引发的血案

最近线上一个模块有内存泄漏,加了http pprof后,发现goroutine一直在增长,怀疑是goroutine泄漏导致的内存泄漏。于是死看代码,发现以下代码片段可能存在问题:

//goroutine
...
for{
    select {
        case ...
            ...
        case ...
            ...
        case <- exitChan:
            break;
    }
}

代码逻辑中,当socket关闭的时候会往exitChan发送数据,这个时候以上代码中的goroutine就需要跳出for循环,结束该goroutine。
问题就出在break上,这里的break是跳出case,还是跳出for?翻书,select-case没有break,所以我应该是写代码的时候以为这个break会跳出for循环。不能确认,那就写个代码测试一下。

package main

import (
	"fmt"
	"time"
)

var exitChan chan bool

func Waiting1(){
	defer func(){
		fmt.Println("waiting1 exit")
	}()
	//do someting
	time.Sleep(time.Second *10)
	exitChan <- true
}

func Waiting2(){
	defer func(){
		fmt.Println("waiting2 exit")
	}()
	for{
		select {
		case <-time.After(time.Second * 2):
			fmt.Println("tick event...")
		case <- exitChan:
			fmt.Println("exit event...")
			break
		}
	}
	
	
}


func main(){
	exitChan = make(chan bool)
	go Waiting1()
	go Waiting2()
	<- time.After(time.Second * 60)
	fmt.Println("main return")

}

运行结果告诉我,select-case下的break果然只是跳出了select的分支,跟C语言中的switch-case一样。只不过C语言中,明确要求要break,而Go则没有要求。
所以,这回stupid了一回,赶紧检查一下其他代码,发现其他select-case的分支,如果要跳出for,都是用的return。可能当时写代码的时候脑袋进了水吧…

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Fortran语言中的select case是一种条件语句,用于根据不同的表达式值执行相应的代码块。它相当于其他编程语言中的switch语句。 select case语句由一个表达式和一系列case分支组成。当表达式的值与某个case分支的值相匹配时,与之对应的代码块将被执行。如果没有任何一种情况匹配,可以使用optional的default分支,即当表达式的值与所有case的值都不匹配时执行的代码块。 select case的语法如下: ```fortran select case (expression) case value1 ... case value2 ... case value3, value4 ... case default ... end select ``` 其中,expression是一个表达式,可以是任何可计算的值。value1, value2等是表达式可能的值,可以是常量、变量或表达式。 下面是一个示例: ```fortran program select_case_example implicit none integer :: num print*, "请输入一个数字:" read*, num select case (num) case (1) print*, "你输入了数字1" case (2, 3) print*, "你输入了数字2或3" case (4:6) print*, "你输入了数字在4到6之间" case default print*, "你输入了一个其他数字" end select end program select_case_example ``` 在这个示例中,根据用户输入的数字,程序将给出相应的回应。如果输入的数字是1,将输出"你输入了数字1";如果输入的数字是2或3,将输出"你输入了数字2或3";如果输入的数字是4到6之间的数,将输出"你输入了数字在4到6之间";如果输入的数字不满足以上任何条件,将输出"你输入了一个其他数字"。 select case语句在对于多种情况的选择时非常便捷,使得程序结构更清晰和易读。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值