延迟调用
使用defer用于注册延迟调用,可以理解为类似PHP对象中的析构函数,只有在ret前才被执行,通常用于释放资源或者错误处理
package main
import "os"
func test() error {
f, err := os.Create("test.txt") //创建一个文件
if err != nil { return err } //创建失败返回错误信息
defer f.Close() //不管是否出现错误都会关闭文件,defer会在ret之前执行
f.WriteString("Hello,world!") //往文件中写入内容
return nil
}
func main() {
test()
}
多个defer注册,按FILO次序执行
package main
func test(x int) int {
defer println("a")
defer println("b")
defer func() {
println(100 / x)
}()
defer println("c")
return 1
}
func main() {
test(20) //输出结果为c 5 b a
}
延迟调用参数在注册时求值或复制,可用指针或闭包延迟读取
package main
func test() {
x, y := 10, 20
defer func(i int) {
println("defer:", i, y) //y闭包引用
}(x) //x被复制
x += 10
y += 100
println("x=", x, "y=", y)
}
func main() {
test()
//结果为:x= 20 y= 120 defer: 10 120
}