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

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

内容简介: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(一)


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

查看所有标签

猜你喜欢:

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

从“为什么”开始

从“为什么”开始

[美] 西蒙·斯涅克 / 苏西 / 海天出版社 / 2011-7 / 32.00元

影响人类的行为:要么靠操纵,要么靠感召。 操纵带来的是交易,是短期效益; 感召带来的是信任,是永续经营! 盖茨走后,微软面临怎样的挑战?后盖茨时代,微软为何从一个希望改变世界的公司沦落为一个做软件的公司? 沃尔玛的灵魂人物过世后,一度被人们热爱的公司,遭到的竟然多是顾客、员工的反感?沃尔玛要怎样做才能重放昔日光彩? 星巴克吸引人们购买的不是咖啡,而是理念?为什么说霍华......一起来看看 《从“为什么”开始》 这本书的介绍吧!

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

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具