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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-28 13:40:12945ブラウズ

How Can I Compare Function Pointers for Equality in Go?

Go における関数ポインターの等価性

Go では、標準のポインター等価演算子 == を使用して 2 つの非 nil 関数ポインターの等価性を比較することは、最近のバージョンでは無効になりました。これは、関数ポインターの同一性を比較することができた Go1 より前の動作からの逸脱です。

関数のポインターの等価性を許可しない理由

関数ポインターの等価性の比較を禁止する動機は次のとおりです。次の理由:

  • パフォーマンス: 関数が実装される可能性があります。環境から変数をキャプチャしないクロージャとして。同一性の比較を許可すると、ランタイムで関数ごとに新しいクロージャーを作成する必要があり、パフォーマンスのオーバーヘッドが発生します。
  • Clarity: 等価性と同一性の混合を避けるために、Go1 演算子 == と != を使用します。同一性ではなく、等価性についてのみ値を比較します。これにより、言語全体で一貫したアプローチが保証されます。

関数のポインターの同等性の達成

関数の直接のポインター比較は許可されなくなりましたが、望ましい動作を達成するための代替アプローチがあります。

  • 一意の変数の割り当て: 個別の変数を宣言します各関数のアドレスを比較します。
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

    fmt.Println(f1 == f1)  // Prints true
    fmt.Println(f1 == f2)  // Prints false
}
  • リフレクションを使用する: リフレクト パッケージは、関数ポインターを含むオブジェクト情報への低レベルのアクセスを提供します。これを使用して関数のアイデンティティを比較できます。
package main

import "fmt"
import "reflect"

func SomeFun() {}
func AnotherFun() {}

func main() {
    sf1 := reflect.ValueOf(SomeFun)
    sf2 := reflect.ValueOf(SomeFun)
    fmt.Println(sf1.Pointer() == sf2.Pointer())  // Prints true

    af1 := reflect.ValueOf(AnotherFun)
    fmt.Println(sf1.Pointer() == af1.Pointer())  // Prints false
}

: リフレクトの使用は未定義の動作に依存します。プラットフォーム間または Go バージョン間での一貫性は保証されません。

以上がGo で関数ポインターを比較して等しいかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。