Golang中这些写法是否等效?

Golang中这些写法是否等效? 这两种错误日志记录方式是否等效?为什么?

     ...
     err := ...
     log.Fatal(err)
}

对比这个版本

     ...
     err := ...
     if err != nil {
          log.Fatal(err)
     }
}
7 回复

关于这个话题还有更多问题吗?

更多关于Golang中这些写法是否等效?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


cinematik:

那么当 err == nil 时,第一个结果会是空输出(终端中显示空行)吗?

你会得到 <nil>

不,它们并不相同。后者仅在 err 对象不为 nil 时记录错误。前者即使在没有错误对象(err == nil)的情况下也会始终记录 err 对象。

hollowaykeanho:

即使没有错误对象(err == nil),正式版本也总是记录 err 对象。

那么当 err == nil 时,第一个结果会是空输出(终端中显示空行)吗?还是在这种情况下不会有任何输出?

hollowaykeanho:

你会得到 <nil>

err = srv.ListenAndServe()
errorLog.Fatal(err)

当一切正常时,上面的代码不会记录任何内容,而当出现错误时会记录错误信息。

cinematik:

err = srv.ListenAndServe()
errorLog.Fatal(err)

当一切正常时上面的代码不会记录任何内容,当出现错误时会记录错误信息

由于服务器正在监听和服务,所以您不会得到任何输出,除非发生错误才会执行下一行代码。既然错误是确定会发生的,您可以使用前一种风格。

顺便说一句,您可以自己测试这个逻辑。我直接用nilerror测试了前一种方式。输出确实显示了<nil>信息。

package main

import (
	"log"
	"errors"
)

func main() {
	log.Fatal(nil)
	
	err := errors.New("an error message")
	log.Fatal(err)
}

// Output:
// 2009/11/10 23:00:00 &lt;nil&gt;
// Program exited: status 1.

这两种错误日志记录方式在功能上不完全等效,主要区别在于错误处理的控制流程。

代码分析

版本一:直接调用

err := ...
log.Fatal(err)

版本二:条件判断

err := ...
if err != nil {
    log.Fatal(err)
}

关键区别

版本一无论err是否为nil都会调用log.Fatal()。当errnil时,程序会输出当前时间戳和"FATAL"标签,然后调用os.Exit(1)终止程序。

版本二只有在err不为nil时才调用log.Fatal(),当errnil时程序继续正常执行。

示例验证

package main

import (
    "log"
    "os"
)

func main() {
    // 测试版本一:err为nil的情况
    var err error = nil
    
    // 这会终止程序,即使err是nil
    log.Fatal(err)
    
    // 这行代码永远不会执行
    println("This line won't be reached")
}
package main

import (
    "log"
)

func main() {
    // 测试版本二:err为nil的情况
    var err error = nil
    
    if err != nil {
        log.Fatal(err)
    }
    
    // 这行代码会正常执行
    println("Program continues normally")
}

实际影响

errnil时:

  • 版本一:程序异常终止,返回退出码1
  • 版本二:程序继续正常执行

err不为nil时:

  • 两个版本的行为相同:输出错误信息并终止程序

因此,版本二的条件判断写法是更安全和正确的错误处理方式

回到顶部