Golang 笔记 4 defer、error、panic
一、defer语句??defer语句仅能被放置在函数或方法中。它由关键字defer和一个调用表达式组成。这里的表达式所表示的既不能是对Go语言内建函数的调用也不能是对Go语言标准库代码包unsafe中的那些函数的调用。实际上,满足上述条件的表达式被称为表达式语句。例:
??函数readFile的功能是读取指定文件或目录本身的内容并将其返回,同时当有错误发生时立即向调用方报告。其中os和ioutil代表的都是Go语言标准库中的代码包。在打开文件且未发现有错误发生之后,紧跟了一条defer语句。其中携带的表达式语句表示的是对被打开文件的关闭操作。当这条defer语句被执行的时候,其中的这条表达式语句并不会被执行。它的确切的执行时机是在其所属的函数(这里是readFile)的执行即将结束的那个时刻。也就是说,在readFile函数真正结束执行的前一刻,file.Close()才会被执行。该语句可保证在readFile函数将结果返回给调用方之前,那个文件或目录一定会被关闭。
??deferIt()的输出结果是4321。
??输出结果为1 2 3 4 40 30 20 10
??此函数执行后会输出5555,而不是4321。原因是defer语句携带的表达式语句中的那个匿名函数包含了对外部的变量的使用。等待这个匿名函数要被执行的时候,包含该defer语句的那条for语句已经执行完毕了。此时的变量i的值已经变为5,因此该匿名函数只会打印5。正确的用法是:把要使用的外部变量作为参数传入到匿名函数中
二、Go语言错误处理 error??Go语言的函数可以一次返回多个结果。上一节中例子:
??函数readFile有两个结果声明。第二个结果声明的类型是error。error是Go语言内置的一个接口类型。它的声明如下:
??显然只要一个类型的方法集合包含了名为Error、无参数声明且仅声明了一个string类型的结果的方法,就相当实现了error接口。os.Open函数的第二个结果值的类型就是这样的。我们把它赋给了变量err。
??Go语言标准库的代码包中有很多由errors.New函数创建出来的错误值。例:os.ErrPermission、io.EOF。我们可以方便的用操作符==来判断一个error类型的值与这些变量的值是否相等,从而来确定错误的具体类型。比如io.EOF,它代表读取方已无更多数据可读,我们在得到这个错误的时候不该把它看成一个错误而应该只去结束相应的读取操作。
三、Go语言异常处理 panic??可以把panic理解为异常。如果不显式的处理panic程序会崩溃。内建函数panic可以人为地产生一个异常。不过,这种致命错误可以被恢复。在Go中,内建函数recover可以做到这一点。
??recover函数会返回一个interface{}类型的值,interface{}代表空接口。Go中的任何类型都是它的实现类型。如果p不为nil那么就说明当前确有异常发生。这时我们要根据情况做相应处理。一旦defer语句中的recover函数调用被执行了,异常就会被恢复,不论我们是否进行了后续处理。我们一定不要只拦截不处理。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |