Go での関数ポインタの等価性
Go では、== または != 演算子を使用して関数ポインタの等価性を比較することは、次のような関数では許可されません。ゼロではありません。この動作により、等価性比較と同一性比較の混合が防止されます。
関数の等価性は関数の同一性とは異なります。 2 つの関数が同じ関数であるかどうかを判断するには同一性比較を使用する必要があり、2 つの関数が同等であるかどうかを判断するには等価比較を使用する必要があります。
Atom の例に示すように、reflect パッケージを使用して関数の同一性を比較します。 、未定義の動作とみなされます。コンパイラは、関数の実装をマージすることで関数を最適化し、比較の信頼性を低くする場合があります。
関数ポインタの同一性を正しく比較するには、関数ごとに一意の変数を作成し、それらの変数のアドレスを比較します。このアプローチにより、最適化に関係なく、同じ関数の関数ポインターを比較することが保証されます。
関数ポインターを比較して同一性を確認する方法の例を次に示します。
package main import "fmt" func F1() {} func F2() {} var F1_ID = F1 // Create a *unique* variable for F1 var F2_ID = F2 // Create a *unique* variable for F2 func main() { f1 := &F1_ID // Take the address of F1_ID f2 := &F2_ID // Take the address of F2_ID // Compare pointers fmt.Println(f1 == f1) // Prints true fmt.Println(f1 == f2) // Prints false }
以上がGo で ID の関数ポインタを安全に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。