2023年12月24日日曜日

Goでmain関数が終わった時の終了ステータスは?

 突然ですが問題です。Go言語で以下のコードを実行した時の終了ステータスは何だと思いますか?

package main

import "fmt"

func main() {
	// 地獄の言葉
	fmt.Println("hell, word")
}

「え、普通に考えたら0じゃないの?」そう思ったあなた。試しに実行してみてください。

はい、0が返ります。

・・・何が言いたいんやこいつは。

仕様はどうなってる?

まあここまでは普通に予想通りなんですが、果たしてGoの言語仕様にはどう書いてあるのでしょうか。

Program execution

Program execution begins by initializing the program and then invoking the function main in package main.

When that function invocation returns, the program exits.

It does not wait for other (non-main) goroutines to complete.

main関数の説明ですが、ここにも終了コードのことは何も書いてありません。

他のページにあるかもしれないと思ってgo.dev内を検索してみましたが、それっぽいページが見当たらない。。。

結局何が言いたいの?

つまり何が言いたいかというと、「普通に考えたら0だし、実際に試したら0だった。そもそも0じゃないと(一般的には)プログラムの実行が失敗したと見なされて困る。でも言語仕様に明記されていないので、確実に0であるという保証がない。確実に0を返したければos.Exit()を使うべし」ということです。

どこかに明記されていたら誰か教えてください。

0 件のコメント:

コメントを投稿