Go- defer
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/3c746afa2f869d0e1f83a5573】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
defer 的作用
逆序执行多个被注册的 defer
常用的收尾工作
代码追踪
记录函数的参数和返回值
代码示例可以直接运行
package main
import (
"fmt"
"io"
"log"
)
func main() {
/*
defer的作用
*/
func1() // func2最后执行
/*
多个defer被注册,逆序执行
*/
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i) // 输出:4 3 2 1 0 而且该语句会在main函数退出之前最后调用
}
/*
常见的收尾操作
文件关闭、解锁、数据库断开连接、打印最终报告
*/
/*
代码追踪
*/
a()
/*
输出:
Entering: a
in a
Entering: b
in b
Leaving: b
Leaving: a
*/
/*
记录函数的参数和返回值
*/
foo("Guess What")
}
func func1() {
fmt.Println("func1 top")
defer func2()
fmt.Println("func1 bottom")
}
func func2() {
fmt.Println("func2")
}
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")
b()
}
func b() {
trace("b")
defer untrace("b")
fmt.Println("in b")
}
func foo(s string) (n int, err error) {
defer func() { // 定义一个匿名函数,并且调用
log.Printf("Call: foo(%q), Ret: %d, %v", s, n, err) // 输出:2021/08/24 17:06:24 Call: foo("Guess What"), Ret: 666, EOF
}()
return 666, io.EOF
}
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/3c746afa2f869d0e1f83a5573】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
还未添加个人签名 2018.09.20 加入
还未添加个人简介
促进软件开发及相关领域知识与创新的传播
评论