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() // 关闭文件 }