golang-错误处理, defer 的使用

爱吃豆包 · · 771 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "bufio"
    "errors"
    "fmt"
    "os"
)

/**
    被 defer 修饰的代码确保在函数结束时发生
    参数在 defer 语句时计算
    defer 列表为后进先出

    一般使用场景
    Open/Close
    Lock/Unlock
    PrintHeader/PrintFooter

 */

func tryDefer() {
    // defer 关键字表示,在这个函数结束之前执行
    // defer 不管是 return 还是 panic 抛异常,都会执行
    // 同时出现 defer 关键字,那么先输出的是2而不是1,因为有个入栈的操作,在最上面的先执行
    defer fmt.Println(1)
    defer fmt.Println(2)

    fmt.Println(3)
}

func printDefer()  {
    for i := 0; i < 100 ; i++  {
        // 在程序结束的时候,才执行这句话
        defer fmt.Println(i)
        if i == 30 {
            panic("抛出一个异常!")

        }
    }
}

// 如果有异常抛出
func printDefers() (i int,err error) {
    for i := 0; i < 100 ; i++  {
        // 在程序结束的时候,才执行这句话
        defer fmt.Println(i)
        if i == 30 {
            // panic("抛出一个异常!")
            return 0, errors.New("抛出一个异常!")
        }
    }

    return i, nil
}

// 写入文件
func writeFile(filename string){
    file, err := os.Create(filename)
    if err != nil {
         panic(err)
    }
    defer file.Close()

    wirte := bufio.NewWriter(file)
    // 刷新缓冲区,表示把内容真正写入到文件
    defer wirte.Flush()

    for i := 0; i < 20; i++  {
        // 写入数据
        fmt.Fprintln(wirte, i)
    }


}

func main()  {
    tryDefer()
    writeFile("1b.txt")
}



有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:爱吃豆包

查看原文:golang-错误处理, defer 的使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

771 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传