ホームページ > バックエンド開発 > Golang > Go で関数ポインターを確実に比較して等しいかどうかを確認するにはどうすればよいですか?

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

Linda Hamilton
リリース: 2024-12-18 09:35:11
オリジナル
234 人が閲覧しました

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

毎週 Go で関数のポインタの等価性を検出する

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

変更の根拠

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

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

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

Reflect パッケージの利用

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート