「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go で関数ポインターを確実に比較して等しいかどうかを確認するにはどうすればよいですか?

Go で関数ポインターを確実に比較して等しいかどうかを確認するにはどうすればよいですか?

2024 年 12 月 22 日に公開
ブラウズ:101

How Can I Reliably Compare Function Pointers for Equality in Go?

Go Weekly での関数のポインタの等価性の検出

従来、Go で 2 つの非 nil 関数ポインタを比較するには、== または != 演算子を使用していました。ただし、最近の変更により、このアプローチではエラーが発生するようになりました。

変更の根拠

関数のポインタの等価性比較の廃止は、等価性と同一性の概念に由来しています。 Go では、== 演算子と != 演算子は、同一性ではなく値の等価性を評価します。この区別は、これらの概念間の混乱を防ぐことを目的としています。

パフォーマンスに関する考慮事項

さらに、関数の比較はパフォーマンスに影響します。たとえば、外部変数を参照しない匿名クロージャは、コンパイラによって単一の実装に最適化される必要があります。関数ポインタを比較すると、この最適化が妨げられ、実行時に新しいクロージャを動的に作成する必要があります。

Reflect パッケージの利用

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