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

栏目: Go · 发布时间: 6年前

内容简介:go语言的语法学起来还是比较快的,但在实战过程中总会遇到这样或那样的错误,逐个解决领悟之后,才能真正掌握go语言的细枝末节,成为一名合格的废话不多说,先吃几个栗子:怎么样,是不是找到一丢丢感觉了呀 : )

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

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

  1. 下面的变量定义是否正确?
var a int, b int, c int
  1. 下面的写法是否正确?
package main

s := "china"

func main() {

}
  1. 请写出打印值:
s := make([]int, 5)

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

fmt.Println(s)

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

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

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

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

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("触发异常")

}

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

a. 

“触发异常”

“打印后”

“打印中”

“打印前”



b. 

“打印后”

“打印中”

“打印前”

“触发异常”



c. 

“打印后”

“触发异常”

“打印中”

“打印前”

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

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

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 函数,因此输出结果为:

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

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~

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Impractical Python Projects

Impractical Python Projects

Lee Vaughan / No Starch Press / 2018-11 / USD 29.95

Impractical Python Projects picks up where the complete beginner books leave off, expanding on existing concepts and introducing new tools that you’ll use every day. And to keep things interesting, ea......一起来看看 《Impractical Python Projects》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具