Go でのファイナライズ: デフォルトのオブジェクトと落とし穴
Go ランタイムは、特定のオブジェクトがガベージ コレクションされるときに自動的にファイナライズします。この組み込みメカニズムは、十分に理解していないと、潜在的な落とし穴につながる可能性があります。
デフォルトのファイナライズされたオブジェクト:
デフォルトの落とし穴ファイナライズ:
os.File がファイナライズされると、オペレーティング システムが起動されてファイル記述子が閉じられます。ただし、このファイル記述子が os.NewFile(fd int, name string) *File を使用して作成された別の os.File オブジェクトと共有されている場合、どちらかのオブジェクトをファイナライズすると、もう一方のオブジェクトが破損します。
たとえば、次のコードを考えてみましょう。 :
package main import ( "fmt" "os" "runtime" ) func open() { os.NewFile(1, "stdout") } func main() { open() // Force finalization of unreachable objects _ = make([]byte, 1e7) runtime.GC() _, err := fmt.Println("some text") // Print something via os.Stdout if err != nil { fmt.Fprintln(os.Stderr, "could not print the text") } }
共有ファイル記述子が原因で、このコードは次のエラーで失敗します:
could not print the text
以上がGo の自動オブジェクト終了処理はどのように機能するのでしょうか?また、その潜在的な落とし穴は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。