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(一)


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

查看所有标签

猜你喜欢:

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

Pro HTML5 and CSS3 Design Patterns

Pro HTML5 and CSS3 Design Patterns

Michael Bowers / Apress / 2011-11-15 / GBP 35.50

Pro HTML5 and CSS3 Design Patterns is a reference book and a cookbook on how to style web pages using CSS3 and HTML5. It contains 350 ready--to--use patterns (CSS3 and HTML5 code snippets) that you ca......一起来看看 《Pro HTML5 and CSS3 Design Patterns》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具