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 语言错误处理
文章图片
image.png 看来循环后才把i值传进去。
func test() { for i := 0; i < 3; i++ { defer func(i int) { fmt.Println(i) }(i) } }

通过(i)把值传进去。
输出:

go|go 语言错误处理
文章图片
image.png

    推荐阅读