1、使用new函数创建自定义错误
创建自定义错误最简单的方法是使用errors包中的New函数
2、使用Errorf给错误添加更多信息
使用fmt包中的Errorf函数,会根据格式说明符,规定错误的格式,并返回一个符合该错误的字符串
3、使用结构体类型和字段提供错误的更多信息
错误可以用实现了error接口的结构体表示
4、使用结构体类型的方法来提供错误的更多信息
1、panic
a:在go语言中,程序一般使用错误来处理异常情况
在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用panic来终止程序。
当函数发生panic时,它会终止执行,在执行完所有的延迟函数后,程序控制返回到该函数的调用方。
这样的过程会一直持续下去,直到当前协程的所
有函数都返回退出,然后程序打印出panic信息,接着打印出堆栈跟踪。
b:程序发生panic时,使用recover可以重新获得对该程序的控制
可以认为panic和recover与其他语言中的try-catch-finally类似
2、什么时候应该使用panic
a: 应该尽可能的使用panic和recover。只有当程序不能继续运行的时候,才使用panic和recover机制
b: panic的用例
一:发生来一个不能恢复的错误,此时程序不能继续运行。一个例子就是web服务器无法绑定所要
求的端口
二:发生来一个编程上的错误。假如我们有一个接收指针参数的方法,而其他人使用nil作为参
数调用来它
3、发生panic时的defer
如果有延迟函数,会先调用它,然后程序控制返回到函数调用方
4、recover
a:recover是一个内建函数,用于重新获得panic协程的控制
b:只有在延迟函数的内部,调用recover才有用。在延迟函数内调用recover,可以取到panic的
错误信息,并且停止panic续发时间。
5、panic、recover和go协程
只有使用相同的go协程中调用recover才管用,recover不能恢复一个不同协程的panic
6、运行时panic
运行时错误(如数组越界)也会导致panic。这等价于调用来内置函数panic,其参数由接口
类型runtime.Error给出
7、恢复后获得堆栈跟踪
当我们恢复panic时,我们就释放来它的堆栈跟踪。有办法可以打印出堆栈跟踪,就是使用
Debug包中的PrintStack函数
1、支持头等函数的编程语言,可以把函数赋值给变量,也可以把函数作为其它函数的参数或返回值
2、匿名函数
没有名称的函数
3、用户自定义的函数类型
type add func(a int,b int) int
3、高阶函数
a:接收一个或多个函数作为参数
b:返回值是一个函数
4、闭包
闭包是匿名函数的一个特例,当一个匿名函数所访问的变量定义在函数体的外部时,就称这样的匿名函数为闭包
5、头等函数的实际用途
反射就是程序能够在运行时检查变量和值,求出它们的类型
1、在运行时检查传递过来的结构体参数的类型,找到结构体字段,接着创建查询
2、reflect包
在go语言中,reflect实现了运行时反射,reflect包会帮助识别interface{}变量的底层具体类型
和具体值
a:reflect.Type表示interface{}的具体类型
b:reflect.Value表示它的具体值
c:reflect.kind表示该类型的特定类别
3、NumFiled()和Field()方法
NumFiled()方法返回结构体中字段的数量,而Field(i int)方法返回字段i的reflect.Value
4、Int()和String()方法
Int和String可以帮助我们分别取出reflect.Value作为int64和string
使用反射编写清晰和可维护的代码是十分困难的,应尽可能避免使用