3、错误处理和资源管理


defer 调用

1、栗子

func main() {
    fmt.Println(1)
    defer fmt.Println(3)
    fmt.Println(2)
    defer fmt.Println(4)
    // 1 2 4 3
    // defer函数 会在 主函数结束前调用
    // defer 语句是按 先进后出 顺序执行
}

2、栗子

func main() {
    file,err := os.Create("haha.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close() // 关闭文件

    writer := bufio.NewWriter(file)
    defer writer.Flush() // 写入文件

    for i := 0; i < 100; i ++ {
        fmt.Fprintln(writer,i)
    }
}

错误处理

func main() {
    file,err := os.OpenFile("haha.txt",os.O_EXCL|os.O_CREATE,0666)
    if err != nil {
        // 若 error 是 *os.PathError
        if patherr,ok := err.(*os.PathError);ok{
            fmt.Println(patherr.Op)
            fmt.Println(patherr.Path)
            fmt.Println(patherr.Err)
        } else {
            // 新建 error
            err = errors.New("other error")
            panic(err)
        }
        return
    }
    defer file.Close() // 关闭文件
}

相关