43-defer

// Defer 用于确保稍后在程序执行执行函数调用,通常用于清理目的。

// 在其他编程语言中,defer通常用于ensure或者finally中。

package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用createFile获取一个文件对象后,
	f := createFile("./43-defer.txt")
	// f = createFile("/defer.txt"),运行后将会报错

	// 立即使用defer和closeFile将该文件关闭,
	// 这将在writeFile函数执行完成后,在封闭函数main的末尾执行
	defer closeFile(f)
	writeFile(f)
}

func createFile(p string) *os.File {
	fmt.Println("creating")
	f, err := os.Create(p)
	if err != nil {
		panic(err)
	}
	return f
}

func writeFile(f *os.File) {
	fmt.Println("writing")
	fmt.Fprintf(f, "The file is generated by 43-defer.go.")
}

func closeFile(f *os.File) {
	fmt.Println("closing")
	// 关闭文件是检查错误很重要
	// 即使是在defer中也是如此
	err := f.Close()
	if err != nil {
		fmt.Fprintf(os.Stderr, "error:%v\n", err)
		os.Exit(1)
	}
}

//  运行程序确定文件在写入后被关闭
上次修改: 10 January 2020