教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 关于 Golang defer 的使用规则和案例

关于 Golang defer 的使用规则和案例

发布时间:2023-01-07   编辑:jiaochengji.com
教程集为您提供关于 Golang defer 的使用规则和案例等资源,欢迎您收藏本站,我们将为您提供最新的关于 Golang defer 的使用规则和案例资源

golang defer 这个使用的执行流程一直很绕,所以决定写一篇文记录一下。

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

案例一

package main

import (
    "fmt"
)

func main() {
    test()
}

func test() {
    defer f1(f2())

    fmt.Println("2")
    return
}

func f1(i int) int {
    return i
}

func f2() int {
    fmt.Println("1")
    return 1
}

输出:12

案例二

package main

import (
    "fmt"
)

func main() {
    defer getFunc()()
    fmt.Println("2")
}

func getFunc() func() {
    fmt.Println("1")
    return func() {
        fmt.Println("3")
    }
}

输出:123

注意区分传入的是函数变量还是函数

1、函数变量

package main

import (
    "fmt"
)

func main() {
    defer f3(f2)
    fmt.Println("2")
}

func f2() int {
  fmt.Println("1")
  return 1
}

func f3(f func() int) int {
  return f()
}

输出:21

2、函数

package main

import (
    "fmt"
)

func main() {
    defer f1(f2())
    fmt.Println("2")
}

func f1(i int) int {
  return i
}

func f2() int {
  fmt.Println("1")
  return 1
}

输出:12

规则二:defer执行顺序为先进后出

package main

import (
    "fmt"
)

func main() {
    defer func() {
        fmt.Println("3")
    }()
    defer func() {
        fmt.Println("2")
    }()
    fmt.Println("1")
}

输出:123

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

func main() {
    i := 1
    defer func() {
        i  
        fmt.Println(i)
    }()
    fmt.Println(i)
}

输出:12

所有规则复合体

package main

import (
    "fmt"
)

type msg struct {
    Num int
}

func (m *msg) print() {
    fmt.Println(m.Num)
}

func main() {
    m := new(msg)
    m.Num = 1
    defer m.print()
    defer func(m msg) {
        m.print()
    }(*m)
    m.Num = 2
}

输出:12


到此这篇关于“关于 Golang defer 的使用规则和案例”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang中defer关键字实现原理
Golang defer 使用时的坑
【Go学习】一道简单Golang面试题中关于panic和defer的执行顺序引发的惨案
golangdefer特性姿势还是有必要了解下的!!!
[翻译]Go的Defer、Panic和Recover
defer ,panic,recover
go语言中defer函数
详解defer实现机制(附上三道面试题)
go那些事儿|defer必掌握知识
golang的defer机制详解

[关闭]
~ ~