go学习笔记延迟调用

延迟调用

使用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
}
坚持原创技术分享,您的支持将鼓励我继续创作!