golang for的select体中如何break外层循环

文章目录

      • 0. 问题
      • 1.解决办法
        • 1.1 使用带标签的break
        • 1.2 使用return
        • 1.3 使用标志

0. 问题

默认在select中break是只跳脱了select体,而不是结束for循环

for {
	select{
		case <-tick.C:
			//do someting
		case <- stop:
			break //break的不是for循环, 而是跳脱select,执行doNext()
	}
	doNext()
}

如何在for的select体中break到外层循环呢?

1.解决办法

1.1 使用带标签的break

LOOP: for {
	select{
		case <-tick.C:
			//do someting
		case <- stop:
			break LOOP//break的for循环,跳转执行doOther()
	}
	doNext()
}
doOther()

等价于C的goto,但是又不同。比如这里for循环前的标签,对于如果使用goto LOOP会导致再次执行循环。但是golang的break到这里是跳出循环,执行循环之后的操作

1.2 使用return

for {
	select{
		case <-tick.C:
			//do someting
		case <- stop:
			return //干净利落,适合退出goroutin的场景
	}
	doNext()
}
doOther()

1.3 使用标志

isStop := false
for {
	select{
		case <-tick.C:
			//do someting
		case <- stop:
			isStop = true//干净利落,适合退出goroutin的场景
			break
	}
	if isStop {
		break
	}
	doNext()
}
doOther()

你可能感兴趣的:(Golang)