前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang面试基础系列-defer(一)

golang面试基础系列-defer(一)

作者头像
astraw99
发布2021-09-22 12:32:06
4040
发布2021-09-22 12:32:06
举报
文章被收录于专栏:K8s 系列K8s 系列

go语言的语法学起来还是比较快的,但在实战过程中总会遇到这样或那样的错误,逐个解决领悟之后,才能真正掌握go语言的细枝末节,成为一名合格的gopher。

废话不多说,先吃几个栗子:

1. 下面的变量定义是否正确?

代码语言:javascript
复制
var a int, b int, c int

2. 下面的写法是否正确?

代码语言:javascript
复制
package main

s := "china"

func main() {

}

3. 请写出打印值:

代码语言:javascript
复制
s := make([]int, 5)

s = append(s, 1, 2, 3)

fmt.Println(s)

怎么样,是不是找到一丢丢感觉了呀 : )

===============================

今天第一节(儿童节也阔以愉快的写博客~),分享几点defer的细枝末节:

Defer规则一:下面的语句会触发panic吗?

代码语言:javascript
复制
func main() {
    deferCall()
}

func deferCall() {

    defer func() {
        fmt.Println("打印前")
        /*if err := recover(); err != nil {
            fmt.Println(err)            
        }*/
    }()


    defer func() { fmt.Println("打印中") }()

    defer func() { fmt.Println("打印后") }()

    panic("触发异常")

}

【解析】当 defer 与 panic 处于同一个 goroutine 中,defer 会试图去recover(注释部分),此时由于没有 recover 进行捕获,因此会出现如下几种输出:

a.

“触发异常”

“打印后”

“打印中”

“打印前”

b.

“打印后”

“打印中”

“打印前”

“触发异常”

c.

“打印后”

“触发异常”

“打印中”

“打印前”

出现以上几种不同的输出结果,笔者的理解(欢迎讨论~)是打印到 stdout 的 print函数在同一时刻争抢的结果,因为程序的实际执行顺序是:遇到panic,先执行 defer 中 fmt.Println 后,再输出 panic 自己的报错。

Defer规则二:当defer被声明时,其参数就会被实时解析

代码语言:javascript
复制
func calc(index string, a, b int) int {

    ret := a + b

    fmt.Println(index, a, b, ret)

    return ret

}

func main() {

    a := 1

    b := 2

    defer calc("1", a, calc("10", a, b))

    a = 0

    defer calc("2", a, calc("20", a, b))

    b = 1

}

【解析】当 defer 被调用时,a, b 会取当前实时解析值,并先计算defer 里层 calc 的值保存下来,最后再执行defer 外层 calc函数,因此输出结果为:

代码语言:javascript
复制
10 1 2 3
20 0 2 2
2 0 2 2
1 1 3 4

Defer规则三:可以读取有名返回值

代码语言:javascript
复制
package main

import "fmt"

func main() {    v := c()    fmt.Println(v)
}

func c() (i int) {    defer func() { i++ }()    return 1

}

【解析】当 defer 返回时,获取到返回值 i = 1,进行 defer 里面的 i++,所以返回输出是2,而不是1。

以上就是今天分享的关于 defer 的几个point,这些硬知识看书很容易忽略,在实战中才能更好的掌握,keep moving~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 稻草人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档