【进大厂必看面试题】错误和异常、CGO、fallthrough_cgo相关的面试问题(1)

而defer的存在,让我们有更多的选择,比如在defer中通过recover截取panic,从而达到try…catch的效果

panic还可以接收一个参数,通常是字符串类型错误信息,执行到panic时,他会打印这个字符串和触发他的调用栈。

当然,我们在写代码时要注意,不是所有的异常都能被捕获到的,像fatal error 和runtime.throw 都是不能被recover的

defer执行顺序

你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反:最早声明的defer最后执行。

总结

当程序运行时,如果遇到引用空指针、下标越界或显式调用panic函数等情况,则先触发panic函数的执行,然后调用延迟函数。调用者继续传递panic,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数等。如果一路在延迟函数中没有recover函数的调用,则会到达该协程的起点,该协程结束,然后终止其他所有协程,包括主协程(类似于C语言中的主线程,该协程ID为1)。

对比Java、C++

错误和异常从Golang机制上讲,就是error和panic的区别。很多其他语言也一样,比如C++/Java,没有error但有errno,没有panic但有throw。

错误异常互相转换

Golang错误和异常是可以互相转换的:

  1. 错误转异常,比如程序逻辑上尝试请求某个URL,最多尝试三次,尝试三次的过程中请求失败是错误,尝试完第三次还不成功的话,失败就被提升为异常了。
  2. 异常转错误,比如panic触发的异常被recover恢复后,将返回值中error类型的变量进行赋值,以便上层函数继续走错误处理流程

CGO

CGO是调用C代码模块,静态库和动态库。

CGO是C语言和Go语言之间的桥梁,原则上无法直接支持C++的类。CGO不支持C++语法的根本原因是C++至今为止还没有一个二进制接口规范(ABI)。

CGO只支持C语言中值类型的数据类型,所以我们是无法直接使用C++的引用参数等特性的。

fallthrough

在一个 switch 块内,每个 case 无需声明 break 来终止,如果想顺序执行使用fallthrough

如果我们想强制执行满足条件case的后一个case,也可以通过设置fallthrough的方式:

代码示例

package main

import "fmt"

func main() {
    switch {
    case false:
            fmt.Println("false1")
            fallthrough
    case true:
            fmt.Println("true1")
            fallthrough
    case false:
            fmt.Println("false2")
            fallthrough
    case true:
            fmt.Println("true2")
    case false:
            fmt.Println("false3")
            fallthrough
    default:
            fmt.Println("default case")
    }
}

思考一下上面代码的执行结果是什么?

执行结果

注意:在switch块内,都建议包含一个 default 语句并且放在最后,即使它什么代码也没有。

延伸知识点:在select块中,default能避免死锁问题。

总结

我们来总结一下:

  1. 在一个 switch 块内,每个 case 无需声明 break 来终止,如果想顺序执行使用fallthrough;如果我们想强制执行满足条件case的后一个case,也可以通过设置fallthrough的方式。
  2. CGO是调用C代码模块,静态库和动态库。CGO只支持C语言中值类型的数据类型,所以我们是无法直接使用C++的引用参数等特性的。
  3. 当程序运行时,如果遇到引用空指针、下标越界或显式调用panic函数等情况,则先触发panic函数的执行,然后调用延迟函数。调用者继续传递panic,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数等。如果一路在延迟函数中没有recover函数的调用,则会到达该协程的起点,该协程结束,然后终止其他所有协程,包括主协程(类似于C语言中的主线程,该协程ID为1)。

一起学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值