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) }