従来、Go で 2 つの非 nil 関数ポインタを比較するには、== または != 演算子を使用していました。ただし、最近の変更により、このアプローチではエラーが発生するようになりました。
関数のポインタの等価性比較の廃止は、等価性と同一性の概念に由来しています。 Go では、== 演算子と != 演算子は、同一性ではなく値の等価性を評価します。この区別は、これらの概念間の混乱を防ぐことを目的としています。
さらに、関数の比較はパフォーマンスに影響します。たとえば、外部変数を参照しない匿名クロージャは、コンパイラによって単一の実装に最適化される必要があります。関数ポインタを比較すると、この最適化が妨げられ、実行時に新しいクロージャを動的に作成する必要があります。
reflect パッケージを使用して関数の同一性を判断することは可能ですが、次の点に注意することが重要です。このアプローチには未定義の動作が伴います。コンパイラが複数の関数を単一の実装に折りたたむことを決定する可能性があるため、このような比較の結果は信頼できません。
関数ポインタを効果的に比較するには、次のアプローチを使用できます。
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 }
各関数に関連付けられた一意の変数へのポインターを使用することにより、関数間のポインターの同一性を効果的に検出できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3