Go语言在循环中panic后还能继续执行for循环?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言在循环中panic后还能继续执行for循环?相关的知识,希望对你有一定的参考价值。
参考技术A 如下的例子,要打印100以内能被5整除的数,以panic的方式选择出来并打印。如果用下面的方式,执行到第一个panic就会跳出for循环
只能输出第一个匹配项,然后退出for循环。
那么如何保证在for循环处理完panic不退出循环,直到打印完所有满足条件的数值?
golang的panic被恢复后,能继续执行比recover更早的defer,或者返回到recover函数的调用方,然后继续执行下去。
所以,我们可以把panic和recover放到单独的函数中,然后在for循环里调用这个函数,这个函数panic并恢复后,能返回到调用方for循环并继续循环下去。
执行结果是所有0到100的所有符合panic条件的都能正确处理,for循环没有异常退出:
golang的panic属于非常严重的错误,一旦panic没有recover的话,程序就退出了。一般避免主动panic,影响程序稳定性。
recover函数要放在defer里面,并且只能恢复同一个goroutine的并且是直接调用链函数发生的panic。recover不能恢复上一层函数的panic。
go语言学习笔记 — 基础 — 控制流:break, continue循环控制语句
循环控制语句可以控制循环体内语句的执行过程。go语言支持以下几种循环控制语句:
控制语句 | 描述 |
---|---|
break语句 | 经常用于中断当前 for 循环或跳出 switch 语句 |
continue语句 | 跳过当前循环的剩余语句,然后继续进行下一轮循环。 |
goto语句 | 将控制转移到被标记的语句。 |
break语句
Go语言中break语句用于以下两方面:
- 在for循环语句中,break用于跳出循环,并执行循环之后的语句。
- 在switch开关语句中,break用于执行一条case后跳出语句。
break语法格式如下:break
在for循环中,主动跳出
package main
import "fmt"
func main() {
// for循环
for a := 10; a < 20; a++{
fmt.Printf("a的值为: %d\\n", a)
if a == 15 {
// 使用break语句作为终止条件,跳出循环
break
}
}
}
continue语句
Go语言的continue语句,有点像break语句。但是continue不是跳出循环,而是跳过当前循环执行下一次循环。在for循环中,执行continue语句会触发执行for增量语句。
continue语法格式如下:continue
在for循环中,跳过某个情况,继续执行循环:
package main
import "fmt"
func main() {
// for 循环
for a :=10; a < 20; a++ {
// 跳过 a=15 这个情况
if a == 15 {
continue
}
fmt.Printf("a 的值为 %d\\n", a)
}
}
以上是关于Go语言在循环中panic后还能继续执行for循环?的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 控制流:break, continue循环控制语句