GO语言中err接口及defer延迟异常怎么处理
GO语言中err接口及defer延迟异常怎么处理
这篇“GO语言中err接口及defer延迟异常怎么处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“GO语言中err接口及defer延迟异常怎么处理”文章吧。
err接口
Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下:
typeerrorinterface{Error()string}
调用对应接口
err:=errors.New("thisisnormalerr")fmt.Println(err.Error())err2:=fmt.Errorf("thisisnormalerr")fmt.Println(err2)
案例:除数b为0时
packagemainimport("errors""fmt")funcmain(){//接收错误信息和正确信息result,err:=test(5,0)//加了判断,如果没有错误err=niliferr!=nil{fmt.Println(err)}else{fmt.Println(result)}}//b为0时抛出异常functest(a,bint)(resultint,errerror){//返回错误信息err=nilifb==0{err=errors.New("b不能为0")}else{result=a/b}return}
panic函数
error返回的是一般性的错误,但是panic函数返回的是让程序崩溃的错误。
一般而言,当panic异常发生时,程序会中断运行。
所以,我们在实际的开发过程中并不会直接调用panic( )函数,但是当我们编程的程序遇到致命错误时,系统会自动调用该函数来终止整个程序的运行,也就是系统内置了panic函数。
案例
packagemainimport"fmt"funcmain(){test1()test2()test3()}functest1(){fmt.Println("test1")}functest2(){panic("panictest2")//程序中断}functest3(){fmt.Println("test3")}
结果:
test1
panic: panic test2
goroutine 1 [running]:
main.test2(...)
defer延迟
总结
关键字 defer⽤于延迟一个函数的执行,调用了,但是没有执行,也会完成参数的传递
deferfmt.Println("333")deferfmt.Println("222")deferfmt.Println("111")依次输出顺序:111,222,333
如果一个函数中有多个defer语句,它们会以后进先出的顺序执行。
注意,defer语句只能出现在函数的内部。
defer与匿名函数结合使用
案例1:无参数
packagemainimport"fmt"funcmain(){a:=10b:=20deferfunc(){fmt.Println("匿名函数a",a)fmt.Println("匿名函数b",b)}()a=100b=200fmt.Println("main函数a",a)fmt.Println("main函数b",b)}
结果:
main函数a 100
main函数b 200
匿名函数a 100
匿名函数b 200
案例二:有参数
packagemainimport"fmt"funcmain(){a:=10b:=20//调用了,也传参数了,但是没有执行deferfunc(a,bint){//添加参数fmt.Println("匿名函数a",a)fmt.Println("匿名函数b",b)}(a,b)//传参数a=100b=200fmt.Println("main函数a",a)fmt.Println("main函数b",b)}
结果:
main函数a 100
main函数b 200
匿名函数a 10
匿名函数b 20
recover防止程序中断
运行时panic异常一旦被引发就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。
Go语言为我们提供了专用于“拦截”运行时panic的内建函数——recover。它可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。
注意:recover只有在defer调用的函数中有效。
functestA(){fmt.Println("testA")}functestB(xint){//设置recover()//在defer调用的函数中使用recover()deferfunc(){//防止程序崩溃//recover()//fmt.Println(recover())//加了一层判断iferr:=recover();err!=nil{fmt.Println(err)}}()//匿名函数vara[3]inta[x]=999}functestC(){fmt.Println("testC")}funcmain(){testA()testB(0)//发生异常中断程序testC()}
以上就是关于“GO语言中err接口及defer延迟异常怎么处理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。
推荐阅读
-
Go语言中的Goroutine和channel怎么使用
Go语言中的Goroutine和channel怎么使用这篇“Go语...
-
go语言中协程与线程的区别有哪些
go语言中协程与线程的区别有哪些这篇文章主要介绍“go语言中协程与...
-
go语言有哪些好处
go语言有哪些好处这篇文章主要介绍“go语言有哪些好处”的相关知识...
-
Go语言中转义符怎么使用
-
go语言如何判断一个文件是否存在
-
go语言中不定参数指的是什么
-
go语言空白标识符怎么使用
go语言空白标识符怎么使用这篇文章主要介绍了go语言空白标识符怎么...
-
go语言预定义标识符怎么使用
go语言预定义标识符怎么使用本文小编为大家详细介绍“go语言预定义...
-
go语言中join方法怎么使用
go语言中join方法怎么使用这篇“go语言中join方法怎么使用...
-
go语言字符串如何将小写转为大写