1. ホーム
  2. go

[解決済み] 遅延呼び出しに対応した囲碁プログラムを終了させるには?

2023-03-18 23:19:56

質問

私は defer を使って手動で作成したアロケーションを解放するために C ライブラリを使って手動で作成したアロケーションを解放する必要があります。 os.Exit を 0 以外のステータスで使用する必要があります。厄介なのは os.Exit はどんな遅延命令もスキップすることです。

package main

import "fmt"
import "os"

func main() {

    // `defer`s will _not_ be run when using `os.Exit`, so
    // this `fmt.Println` will never be called.
    defer fmt.Println("!")
    // sometimes ones might use defer to do critical operations
    // like close a database, remove a lock or free memory

    // Exit with status code.
    os.Exit(3)
}

遊び場です。 http://play.golang.org/p/CDiAh9SXRM から盗まれた https://gobyexample.com/exit

宣言された囲碁プログラムを終了する方法 defer の呼び出しを尊重したままプログラムを終了するにはどうしたらよいでしょうか?また os.Exit ?

どのように解決するのですか?

runtime.Goexit() は、それを実現する簡単な方法です。

Goexitはそれを呼び出したゴルーチンを終了させます。他のゴルーチンは影響を受けません。 Goexitはゴルーチンを終了させる前に、すべての遅延された呼び出しを実行します。 しかし、Goexitはパニックではないので、それらの遅延された関数内の任意の回復コールはnilを返します。

しかし

<ブロッククオート

メインゴルーチンからGoexitを呼び出すと、func mainが戻ることなくそのゴルーチンが終了する。func mainが戻ってこないので、プログラムは他のゴルーチンの実行を継続します。他のゴルーチンがすべて終了すると、プログラムはクラッシュします。

ということで、メインゴルーチンから呼び出すと main の先頭に

defer os.Exit(0)

その下に、他のいくつかの defer ステートメントを追加して、他のゴルーチンを停止してクリーンアップするように通知します。