従来、Go で 2 つの非 nil 関数ポインタを比較するには、== または != 演算子を使用していました。ただし、最近の変更により、このアプローチではエラーが発生するようになりました。
関数のポインタの等価比較の廃止は、等価性と同一性の概念に由来しています。 Go では、== 演算子と != 演算子は、同一性ではなく値の等価性を評価します。この区別は、これらの概念間の混乱を避けることを目的としています。
さらに、関数の比較はパフォーマンスに影響します。たとえば、外部変数を参照しない匿名クロージャは、コンパイラによって単一の実装に最適化される必要があります。関数ポインタを比較すると、この最適化が妨げられ、実行時に新しいクロージャを動的に作成する必要があります。
reflect パッケージを使用して関数のアイデンティティを決定することは可能ですが、次の点に注意することが重要です。このアプローチには未定義の動作が伴います。コンパイラーが複数の関数を 1 つの実装に折りたたむことを決定する可能性があるため、このような比較の結果は信頼できません。
関数ポインターを効果的に比較するには、次のアプローチを使用できます。
package main import "fmt" func F1() {} func F2() {} var F1_ID = F1 // Assign a unique variable to F1 var F2_ID = F2 // Assign a unique variable to 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 で関数ポインターを確実に比較して等しいかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。