1. error接口
如何在函數中返回錯誤
// 函數返回錯誤的方法: 將error作爲多重返回值中的最後一個 func Foo(param int)(n int, e error) { if param < 0{ e = errors.New("必須爲正整數") } n = ^param return } func main() { n, e := Foo(-4) if e != nil{ fmt.Printf("錯誤處理",e) } else { fmt.Println(n, e) fmt.Printf("使用正常返回值n") } }
自定義錯誤類型
// 自定義error類型 // 定義一個用於承載錯誤信息的類型 type PathError struct { Op string Path string Err error } func(e *PathError) Error() string { return e.Op + " " + e.Path + " : " + e.Err.Error() } func Stat(name string) (fi os.FileInfo, err error) { var stat syscall.Stat_t err = syscall.Symlink(name, &stat) if err != nil{ return nil, &PathError{"stat", name, err} } return fileInfoFromStat(&stat, name), nil }
2. defer
- 延遲執行defer後面的函數調用,在包含當前defer語句的函數執行return時執行,
- defer後邊必須是函數調用
- 當函數中存在多個defer時,按照lifo隊列的順序執行
// file 對象打開後的自動關閉 func Copyfile(dstname, srcname string)(written int64, err error) { src, err := os.Open(srcname) if err != nil{ return } defer src.Close() dst, err := os.OpenFile(dstname, os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil{ return } defer dst.Close() return io.Copy(dst, src) //return 1, nil } func main() { written, err := Copyfile("/Users/aibyte/Documents/code/go/awesomeProject/4錯誤處理/2.txt", "/Users/aibyte/Documents/code/go/awesomeProject/4錯誤處理/1.txt") if err != nil{ fmt.Println(err) } fmt.Println(written, err) }