当前位置: 首页 > 科技观察

【Go必知必知】错误与异常、CGO、fallthrough_0

时间:2023-03-12 17:47:51 科技观察

本文将详细讲解《Go必知必知》的知识点:错误与异常的对比、panic发生后如何执行代码?它会执行defer代码段吗?什么是CGO?CGO的作用是什么?fallthrougherror&exceptionerrorinswitch指的是可能存在问题的地方,比如打开文件失败。这种情况在人们的意料之中。异常是指不应该发生的问题。例如,引用了一个空指针,这是意想不到的。由此可见,错误是业务流程的一部分,而异常则不是。错误处理:errorGolang引入错误接口类型作为错误处理的标准模式。如果函数返回错误,则返回值类型列表必须包含错误。错误处理过程类似于C语言中的错误码,可以逐层返回,直到处理完毕。异常处理:panic&recoverGolang引入了panic和recover两个内置函数来触发和终止异常处理过程,并引入关键字defer来延迟defer后面的函数的执行。panic&defer当数组越界、访问非法空间或者我们直接调用panic时,panic会停止当前正在执行的程序,包括所有协程。panicexit相比直接exit比较有条理,他会先处理完当前goroutine已经defer挂起的任务,执行完再退出整个程序。defer的存在让我们有了更多的选择,比如通过defer中的recover来拦截panic,从而达到try...catch的效果。panic也可以接收一个参数,通常是字符串类型的错误信息。当执行panic时,他会打印这个字符串并触发他的调用堆栈。当然,我们在写代码的时候要注意,并不是所有的异常都能被捕捉到,像fatalerror和runtime.throw都是defer执行顺序,是无法恢复的。你可以在一个函数中执行多条defer语句,它们的执行顺序是与声明顺序相反:最早的defer最后执行。总结程序运行时,如果遇到引用空指针、下标越界、显式调用panic函数等情况,会先触发panic函数的执行,然后调用delay函数。调用者继续传递panic,因此进程不断重复调用栈:函数停止执行,延迟函数被调用,等等。如果delay函数中一路没有调用recover函数,会到达协程开始,协程结束,然后终止所有其他协程,包括主协程(类似于C语言中的主线程),协程ID为1)。从Golang机制上比较Java和C++的错误和异常就是error和panic的区别。其他很多语言也是如此,比如C++/Java,没有error只有errno,没有panic只有throw。错误和异常可以相互转换Golang错误和异常可以相互转换:错误到异常,比如程序逻辑上尝试请求某个URL,最多尝试3次,3次尝试期间请求失败是一个错误,第三次尝试不成功,失败引发异常。比如panic触发的异常被recover恢复后,给返回值中error类型的变量赋值,让上层函数继续走错误处理流程。CGOCGO调用C代码模块、静态库和动态库。CGO是C语言和Go语言之间的桥梁。原则上不能直接支持C++类。CGO不支持C++语法的根本原因是C++还没有二进制接口规范(ABI)。CGO只支持C语言中值类型的数据类型,所以我们不能直接使用C++的引用参数等特性。fallthrough在一个switch块内,每个case不需要声明break终止,如果要顺序执行,就用fallthrough;如果想强制执行下一个满足条件case的case,也可以设置fallthrough:true:fmt.Println("true1")fallthroughcasefalse:fmt.Println("false2")fallthroughcasetrue:fmt.Println("true2")casefalse:fmt.Println("false3")fallthroughdefault:fmt。Println("defaultcase")}}想想上面代码的执行结果?执行结果注意:在switch块中,建议包含一条default语句放在最后,即使它没有代码。扩展知识点:在select块中,default可以避免死锁问题。总结总结一下:在一个switch块中,每个case不需要声明break终止,如果要顺序执行,就用fallthrough;如果想强制执行下一个满足条件的case,也可以设置fallthrough。CGO就是调用C代码模块、静态库和动态库。CGO只支持C语言中值类型的数据类型,所以我们不能直接使用C++的引用参数等特性。程序运行时,如果引用了空指针,下标越界,或者显式调用了panic函数,都会先触发panic函数的执行,然后调用delay函数。调用者继续传递panic,因此进程不断重复调用栈:函数停止执行,延迟函数被调用,等等。如果delay函数中一路没有调用recover函数,会到达协程开始,协程结束,然后终止所有其他协程,包括主协程(类似于C语言中的主线程),协程ID为1)。本文转载自微信公众号《程序员的升级打怪之旅》,作者“王中阳围棋”,可通过以下二维码关注。转载本文请联系《程序员升级打怪之旅》公众号。