go|go 语言错误处理
go 语言错误处理
panic recover defer 最大公约数 最小公倍数
go语言中的没有try catch的。代替的是panic-recover的机制。手动编写错误提示。
【go|go 语言错误处理】举个栗子:
//求正整数a和b的最小公倍数
package main import "fmt"
//最小公约数
func multiple(a, b int) int {
c := divisor(a, b)
return (a * b / c)
}
//最大公约数
func divisor(a, b int) int {
var r int
fmt.Println(a, "%", b, "=", a%b)
for {
r = a % b
if r != 0 {
a = b
b = r
} else {
break
}
}
return b
}
func main() {
fmt.Println("aa")
var a, b int
fmt.Scanf("%d,%d", &a, &b)
defer func() {
if err := recover();
err != nil {
fmt.Println("异常退出", err)
} else {
fmt.Println(multiple(a, b))
}
}()
f(a, b)
}
//判定不能a>b
func f(a, b int) {
if a > b {
panic("a不能大于b")
}
}
为了能捕捉到 panic输出的内容,并让其不报错。主程序中需要对使用验证的部分进行defer。
关于defer的func(){}()的问题
尝试一下
func test() {
for i := 0;
i < 3;
i++ {
defer func() {
fmt.Println(i)
}()
}
}
func main(){
test()
}
输出为:
![go|go 语言错误处理](https://img.it610.com/image/info10/d745815b63404f0b9fcabb6304b37a98.png)
文章图片
image.png 看来循环后才把i值传进去。
func test() {
for i := 0;
i < 3;
i++ {
defer func(i int) {
fmt.Println(i)
}(i)
}
}
通过(i)把值传进去。
输出:
![go|go 语言错误处理](https://img.it610.com/image/info10/33b8510c500d4555be3e437479f53aee.png)
文章图片
image.png
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 事件处理程序
- 唱歌教学(导致嗓音损坏的几个常见的错误唱歌方法!)
- 调取接口时报404错误(ID:16)
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场