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语言基础语法-for循环语句

go语言学习笔记 — 基础 — 控制流:break, continue循环控制语句

go语言学习笔记 — 基础 — 控制流:for循环语句

Go 循环语句

switch 语句中当执行完一个case后还能执行另一个case么

C语言循环函数用法