zoukankan      html  css  js  c++  java
  • 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")
    }
  • 相关阅读:
    类型转换
    struts2默认拦截器
    struts2自定义拦截器
    struts2之I18N
    代理模式
    抽象类 abstract class 接口
    java基础题
    final
    内部类
    tomcat 端口占用问题解决
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9309829.html
Copyright © 2011-2022 走看看