Go的Error、Log.Fatal和Defer

1.Error

Go的Error、Log.Fatal和Defer_释放资源


Go的Error、Log.Fatal和Defer_函数返回_02


Go的Error、Log.Fatal和Defer_golang_03

1.errors.New 创建errow对象

Go的Error、Log.Fatal和Defer_开发语言_04

2.fmt.Errorf 用字符串创建error对象。

Go的Error、Log.Fatal和Defer_函数返回_05

3.自定义

Go的Error、Log.Fatal和Defer_后端_06


2.Log.Fatal 和 Panic的区别

Go的Error、Log.Fatal和Defer_开发语言_07

func fileSize(filename string) int64 {
f, err := os.Open(filename)
if err != nil {
return 0
}
// 延迟调用Close, 此时Close不会被调用
defer f.Close()
info, err := f.Stat()
if err != nil {
// defer机制触发, 调用Close关闭文件
return 0
}
size := info.Size()
// defer机制触发, 调用Close关闭文件
return size
}

代码中加粗部分为对比前面代码而修改的部分,代码说明如下:

  • 第 10 行,在文件正常打开后,使用 defer,将 f.Close() 延迟调用,注意,不能将这一句代码放在第 4 行空行处,一旦文件打开错误,f 将为空,在延迟语句触发时,将触发宕机错误。
  • 第 16 行和第 22 行,defer 后的语句(f.Close())将会在函数返回前被调用,自动释放资源。