咔叽网单游戏基地

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 55|回复: 0

[Golang] 聊聊golang的defer的使用

[复制链接]
  • TA的每日心情
    无聊
    2019-6-2 14:11
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    2万

    主题

    2万

    帖子

    12万

    积分

    帖子管理员

    Rank: 9Rank: 9Rank: 9

    积分
    125203
    发表于 2020-12-19 15:30:36 | 显示全部楼层 |阅读模式


    本文主要研究一下golang的defer
    defer

      return先赋值(对于命名返回值),然后执行defer,最后函数返回defer函数调用的执行顺序与它们分别所属的defer语句的执行顺序相反defer后面的表达式可以是func或者是method的调用,如果defer的函数为nil,则会panic
    实例

    实例1
    1. // f returns 42
    2. func f() (result int) {
    3.   defer func() {
    4.     // result is accessed after it was set to 6 by the return statement
    5.     result *= 7
    6.   }()
    7.   return 6
    8. }
    复制代码
    这里return先给result赋值为6,之后执行defer,result变为42,最后返回42

    实例2
    1. func f() int {
    2.   result := 6
    3.   defer func() {
    4.     // result is accessed after it was set to 6 by the return statement
    5.     result *= 7
    6.   }()
    7.   return result
    8. }
    复制代码
    这里return确定返回值6,之后defer修改result,最后函数返回return确定的返回值

    实例3
    1. func multiDefer() {
    2.   for i := 3; i > 0; i-- {
    3.     defer func(n int) {
    4.       fmt.Print(n, " ")
    5.     }(i)
    6.   }
    7.   for i := 3; i > 0; i-- {
    8.     defer fmt.Print(i, " ")
    9.   }
    10. }
    复制代码
    多个defer函数,按顺序逆序执行,这里输出1 2 3

    实例4
    1. var fc func() string
    2. func main() {
    3.   fmt.Println("hello")
    4.   defer fc()
    5. }
    复制代码
    由于defer指定的func为nil,这里panic

    实例5
    1. func main() {
    2.   for i := 3; i > 0; i-- {
    3.     defer func() {
    4.       fmt.Print(i, " ")
    5.     }()
    6.   }
    7. }
    复制代码
    由于defer这里调用的func没有参数,等执行的时候,i已经为0,因而这里输出3个0

    小结

    defer可以拆解为return赋值,defer执行,最后代码返回三步;defer的顺序按逆序执行。
    doc

    Defer_statements
    Golang之Defer
    golang中defer执行时机与常见问题

    到此这篇关于聊聊golang的defer的使用的文章就介绍到这了,更多相关golang defer内容请搜索咔叽论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持咔叽论坛!

    原文地址:https://www.jb51.net/article/201167.htm
    回复

    使用道具 举报

    QQ|免责声明|手机版|咔叽网单

    GMT+8, 2021-3-7 22:38

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表