美文网首页go学习go
go的defer用法范例

go的defer用法范例

作者: 咕咕鷄 | 来源:发表于2017-01-15 17:16 被阅读43次

摘抄整理自《the way to go》

关键字defer允许我们推迟到函数返回之前(或任意位置执行return语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为return语句同样可以包含一些操作,而不是单纯地返回某个值)。

关键字defer的用法类似于面向对象编程语言 Java 和 C# 的finally语句块,它一般用于释放某些已分配的资源。

通常我们会将一些函数的收尾工作通过defer执行,使代码结构更清晰。

package main

import "fmt"

func main() {
    doDBOperations()
}

func connectToDB() {
    fmt.Println("ok, connected to db")
}

func disconnectFromDB() {
    fmt.Println("ok, disconnected from db")
}

func doDBOperations() {
    connectToDB()
    fmt.Println("Defering the database disconnect.")
    defer disconnectFromDB() //function called here with defer
    fmt.Println("Doing some DB operations ...")
    fmt.Println("Oops! some crash or network error ...")
    fmt.Println("Returning from function here!")
    return //terminate the program
    // deferred function executed here just before actually returning, even if
    // there is a return or abnormal termination before
}

接下来看一些另类用法
使用 defer 语句实现代码追踪

package main

import "fmt"

//一个基础但十分实用的实现代码执行追踪的方案就是在进入和离开某个函数打印相关的消息,即可以提炼为下面两个函数:
func trace(s string)   { fmt.Println("entering:", s) }
func untrace(s string) { fmt.Println("leaving:", s) }

func a() {
    trace("a")
    defer untrace("a")
    fmt.Println("in a")
}

func b() {
    trace("b")
    defer untrace("b")
    fmt.Println("in b")
    a()
}

func main() {
    b()
}

输出:

entering: b
in b
entering: a
in a
leaving: a
leaving: b

上面的代码还可以修改为更加简便的版本

package main

import "fmt"

func trace(s string) string {
    fmt.Println("entering:", s)
    return s
}

func untrace(s string) {
    fmt.Println("leaving:", s)
}

func a() {
    defer untrace(trace("a"))
    fmt.Println("in a")
}

func b() {
    defer untrace(trace("b"))
    fmt.Println("in b")
    a()
}

func main() {
    b()
}

使用 defer 语句来记录函数的参数与返回值

下面的代码展示了另一种在调试时使用 defer 语句的手法

package main

import (
    "io"
    "log"
)

func func1(s string) (n int, err error) {
    defer func() {
        log.Printf("func1(%q) = %d, %v", s, n, err)
    }()
    return 7, io.EOF
}

func main() {
    func1("Go")
}

输出:

Output: 2011/10/04 10:46:11 func1("Go") = 7, EOF

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

相关文章

  • Go语言基础(二)

    目录 关键字 defer go的defer用法范例[https://www.jianshu.com/p/7ada9...

  • go的defer用法范例

    摘抄整理自《the way to go》 关键字defer允许我们推迟到函数返回之前(或任意位置执行return语...

  • goLang异常处理

    defer defer是go提供的一种资源处理的方式。defer的用法遵循3个原则在defer表达式被运算的同时,...

  • go defer用法

    defer 通常用于 open/close, connect/disconnect, lock/unlock 等这...

  • go语言的defer语句

    go语言defer语句的用法 defer的语法 defer后面必须是函数调用语句,不能是其他语句,否则编译器会出错...

  • GO中defer关键字

    defer关键字在go中用于return之前执行,在golang官方文档中有说明。defer的用法类似java中的...

  • go语言defer的用法

    用法介绍: defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源、关闭数...

  • golang defer 特性

    defer.go

  • Go Defer

    Go Defer 如果函数里面有多条defer指令,他们的执行顺序是反序,即后定义的defer先执行。 defer...

  • Go 延迟调用 defer 用法详解

    引子 概述 defer (延迟调用)是 Go语言中的一个关键字,一般用于释放资源和连接、关闭文件、释放锁等。和de...

网友评论

    本文标题:go的defer用法范例

    本文链接:https://www.haomeiwen.com/subject/syzybttx.html