結論: APIを利用する場合はきちんとドキュメントを読みましょう(´・ω・`)
go言語のlog.Fatal
、log.Fatalf
およびlog.Fatalln
はメッセージ出力後にos.Exit(1)
を発行し、プロセスを終了しようとします。たとえば以下のようなプログラムがあったとします。
main.go
package main
import (
"fmt"
"log"
)
func main() {
fmt.Println("BEFORE")
log.Fatalln("FATAL")
fmt.Println("AFTER")
}
これをビルドして実行すると、FATAL
を出力した後に終了ステータス1でプログラムが終了してしまっていることがわかります (AFTER
が出力されていない)
$ go build .
$
$ ./fataltest
BEFORE
2020/11/15 21:02:55 FATAL
$
$ echo $?
1
ほかのプログラミング言語やライブラリによってはログレベルとしてFATALを有しているものがあります。要するにlog.Fatal
系の関数を「FATALレベルのログを出力してくれるものなのか!」と思って使うと、思わぬバグを生む可能性があります--というかわたしは生みました (反省)
参考
- GoDoc: Package log
- 稼働確認環境: go version go1.15.1 linux/amd64