goLang学习笔记(四)

252 阅读4分钟

三十一:自定义错误

1、使用new函数创建自定义错误
    创建自定义错误最简单的方法是使用errors包中的New函数

2、使用Errorf给错误添加更多信息
    使用fmt包中的Errorf函数,会根据格式说明符,规定错误的格式,并返回一个符合该错误的字符串

3、使用结构体类型和字段提供错误的更多信息
     错误可以用实现了error接口的结构体表示

4、使用结构体类型的方法来提供错误的更多信息

三十二:panic和recover

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

使用反射编写清晰和可维护的代码是十分困难的,应尽可能避免使用