Golang 笔试面试学习第一天

Golang 笔试面试学习第一天

Golang轻松学习


个人博客站点:
简书: 😽 猫轻王 https://www.jianshu.com/u/6cce817646be
掘金: 😽 猫轻王 https://juejin.cn/user/1640918680347453
CSDN: 😽 猫轻王 https://blog.csdn.net/moer0
个人项目主页:https://github.com/moercat


一、defer 是什么?

<font color=black >正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

二、详细代码

1.defer先进后出原则

代码如下(示例):

package main

 import (
     "fmt"
 )

 func main() {
     deferCall()
 }

func deferCall() {
    defer func() { fmt.Println("打印前") }()
    defer func() { fmt.Println("打印中") }()
    defer func() { fmt.Println("打印后") }()
    panic("触发异常")
}

输出:

打印后
打印中
打印前
panic: 触发异常

原理:

其实golang 中的defer 关键字会在 main 函数所有语句之后,return 之前时候调用
压栈式执行,也就是说先注册的函数后调用。
如上,我们注册的顺序式 前,中,后,最后打印结果自然是反着来的,程序输出:
打印后 打印中 打印前
最终才 panic: 触发异常

也就是压栈式执行的逻辑,栈会遵循先进后出原则,每个defer语句都相当于执行一次进栈操作,之后在函数所有语句之后,return 之前时候依次出栈,那么晚进栈的自然早出栈。

2.defer recover 错误捕获

代码如下(示例):

package main

import (
    "fmt"
)

func main() {
    deferError()
}

func deferError() {
    defer func() { fmt.Println("打印前") }()
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    defer func() { fmt.Println("打印中") }()
    defer func() { fmt.Println("打印后") }()
    panic("触发异常")
}

输出:

打印后
打印中
触发异常
打印前

由于recover 在defer 内提前声明,且defer语句在panic之前,那么defer在所有语句执行结束后便会执行,此时recover 接收到当前程序内的panic抛出的error。程序则不会因为错误中断,而会执行defer内的程序,也就是该程序的 fmt.Println(err)语句,由于defer依旧遵循着先进后出原则,那么即使panic在defer执行前便已运行,却被捕获在defer中间打印


总结

通过以上两个例子可以轻松了解在Golang中defer的使用方式,defer在我们工作中的重要性不言而喻。由于错误捕获与在程序运行后执行的逻辑,非常适合我们的编写中间与进行自定义的错误处理,或者将程序依次上抛进行捕获。


希望这个博客能对你有所益处。我是轻王,我为自己代言。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容