本文实例讲述了GO语言延迟函数defer用法。分享给大家供大家参考。具体分析如下:
defer 在声明时不会立即执行,而是在函数 return 后,再按照 FILO (先进后出)的原则依次执行每一个 defer,一般用于异常处理、释放资源、清理数据、记录日志等。这有点像面向对象语言的析构函数,优雅又简洁,是 Golang 的亮点之一。
代码1:了解 defer 的执行顺序
package mainimport "fmt"
func fn(n int) int { defer func() { n++ fmt.Println("3st:", n) }()
defer func() { n++ fmt.Println("2st:", n) }()
defer func() { n++ fmt.Println("1st:", n) }()
return n //没有做任何事情 }
func main() { fmt.Println("函数返回值:", fn(0)) }
1st: 1
2st: 2
3st: 3
函数返回值: 0
代码2:经典应用实例
func CopyFile(dst, src string) (w int64, err error) { srcFile, err := os.Open(src) if err != nil { return } defer srcFile.Close() //每次申请资源时,请习惯立即申请一个 defer 关闭资源,这样就不会忘记释放资源了dstFile, err := os.Create(dst) if err != nil { return } defer dstFile.Close()
return io.Copy(dstFile, srcFile) }
希望本文所述对大家的GO语言程序设计有所帮助。
主要内容:多个延迟执行语句的处理顺序,使用延迟执行语句在函数退出时释放资源Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。 关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者
在 Go 语言中的 defer 关键字就是 Go 语言中延迟语句的标志。Go 语言会在函数即将返回时按逆序执行 defer 后的语句。也就是说先被 defer 的语句后执行,最先执行最后被 defer 的语句。defer 和有些语言中的 finally 语句块的用法类似,一般都用于释放一些资源,最常用的地方就是进程锁的释放。 Tips:关于 defer 的进程锁的释放在 Go 语言的多线程中会有介
延迟调用一个函数,直到当前调用堆栈已经清除。 使用 setTimeout() ,超时时间为1ms,将新事件添加到浏览器事件队列,并允许渲染引擎完成其工作。使用展开 (...) 运算符为函数提供任意数量的参数。 const defer = (fn, ...args) => setTimeout(fn, 1, ...args); // Example A: defer(console.log, 'a
Go 函数 Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。语法格式如下: func (variable_name variable_data_type) function_name() [return_type]{ /* 函数体*/ } 下面定义一个结构体类型和该类型的一个
函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称,返回类型,和参数。 Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。 函
delay函数:将函数延迟给定的毫秒数,然后使用提供的参数调用它。 是用下划线js编写的。注释来源: 为了让delay函数工作,为什么我们需要使用slice方法和调用(参数,2),这部分做什么?如果我错了,请纠正我。delay函数首先返回setTimeout以执行延迟,而setTimeout函数返回func.apply(null,args)以将所有信息从一个函数传递到另一个函数?但是“null”在