gpt4 book ai didi

聊聊golang的defer的使用

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章聊聊golang的defer的使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

序 。

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

defer 。

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

实例 。

实例1 。

?
1
2
3
4
5
6
7
8
// f returns 42
func f() (result int) {
   defer func() {
     // result is accessed after it was set to 6 by the return statement
     result *= 7
   }()
   return 6
}

这里return先给result赋值为6,之后执行defer,result变为42,最后返回42 。

实例2 。

?
1
2
3
4
5
6
7
8
func f() int {
   result := 6
   defer func() {
     // result is accessed after it was set to 6 by the return statement
     result *= 7
   }()
   return result
}

这里return确定返回值6,之后defer修改result,最后函数返回return确定的返回值 。

实例3 。

?
1
2
3
4
5
6
7
8
9
10
11
func multiDefer() {
   for i := 3; i > 0; i-- {
     defer func(n int) {
       fmt.Print(n, " ")
     }(i)
   }
 
   for i := 3; i > 0; i-- {
     defer fmt.Print(i, " ")
   }
}

多个defer函数,按顺序逆序执行,这里输出1 2 3 。

实例4 。

?
1
2
3
4
5
6
var fc func() string
 
func main() {
   fmt.Println("hello")
   defer fc()
}

由于defer指定的func为nil,这里panic 。

实例5 。

?
1
2
3
4
5
6
7
func main() {
   for i := 3; i > 0; i-- {
     defer func() {
       fmt.Print(i, " ")
     }()
   }
}

由于defer这里调用的func没有参数,等执行的时候,i已经为0,因而这里输出3个0 。

小结 。

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

doc 。

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

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

原文链接:https://segmentfault.com/a/1190000038348618 。

最后此篇关于聊聊golang的defer的使用的文章就讲到这里了,如果你想了解更多关于聊聊golang的defer的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com