• Go 语言defer用法


    defer延迟调用:

    1、确保调用在函数结束时发生;

    2、defer列表为先进后出;

    3、通常在Open/Close  Lock/Unlock中使用。

    defer调用顺序示例:

    package main
    
    import (
        "fmt"
    )
    
    func deferType() {
        defer fmt.Println("defer 01")
        defer fmt.Println("defer 02")
        fmt.Println("hello defer")
        defer fmt.Println("defer 03")
        panic("hello panic")
        defer fmt.Println("defer 04")    // panic后的defer不会被执行
    }
    
    
    func main() {
        deferType()
    }
    
    输出结果:
    
    hello defer
    panic: hello panic
    defer 03
    defer 02
    defer 01
    
    goroutine 1 [running]:
    main.deferType()
        /Users/shongbing/go/src/imooc/errhanding/defer/defer.go:15 +0x19b
    main.main()
        /Users/shongbing/go/src/imooc/errhanding/defer/defer.go:35 +0x22

    defer 关闭文件

    package main
    
    import (
        "os"
        "bufio"
        "fmt"
    )
    
    func Fibonacci() func() int {
        // 斐波那契数列,返回一个intGen类型
        a, b := 0, 1
        return func() int {
            a, b = b, a + b
            return a
        }
    }
    
    func writeFile(filename string) {
        file, err := os.Create(filename)
        if err != nil {
            panic(err)
        }
        defer file.Close()
    
        writer := bufio.NewWriter(file)
        defer writer.Flush()
        f := Fibonacci()
        for i:=0; i<20; i++ {
            fmt.Fprintln(writer, f())
        }
    }
    
    func main() {
        writeFile("fib.txt")
    }
  • 相关阅读:
    第一部分 Linux的规划与安装
    第二部分 Linux 文件、目录与磁盘格式
    for in 遍历对象
    时间
    javaScript模块化
    Hbuilder将移动app或者web项目打包
    echarts的通用属性的介绍
    echart的x轴或y轴区间标签如何从大到小排列
    数组的sort()排序
    解决vscode下载很慢的问题
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9309829.html
Copyright © 2020-2023  润新知