Golang中这些写法是否等效?
Golang中这些写法是否等效? 这两种错误日志记录方式是否等效?为什么?
...
err := ...
log.Fatal(err)
}
对比这个版本
...
err := ...
if err != nil {
log.Fatal(err)
}
}
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)当一切正常时上面的代码不会记录任何内容,当出现错误时会记录错误信息
由于服务器正在监听和服务,所以您不会得到任何输出,除非发生错误才会执行下一行代码。既然错误是确定会发生的,您可以使用前一种风格。
顺便说一句,您可以自己测试这个逻辑。我直接用nil和error测试了前一种方式。输出确实显示了<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 <nil>
// Program exited: status 1.
这两种错误日志记录方式在功能上不完全等效,主要区别在于错误处理的控制流程。
代码分析
版本一:直接调用
err := ...
log.Fatal(err)
版本二:条件判断
err := ...
if err != nil {
log.Fatal(err)
}
关键区别
版本一无论err是否为nil都会调用log.Fatal()。当err为nil时,程序会输出当前时间戳和"FATAL"标签,然后调用os.Exit(1)终止程序。
版本二只有在err不为nil时才调用log.Fatal(),当err为nil时程序继续正常执行。
示例验证
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")
}
实际影响
当err为nil时:
- 版本一:程序异常终止,返回退出码1
- 版本二:程序继续正常执行
当err不为nil时:
- 两个版本的行为相同:输出错误信息并终止程序
因此,版本二的条件判断写法是更安全和正确的错误处理方式。

