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

Go で ID の関数ポインタを安全に比較するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-26 17:55:09699ブラウズ

How Can I Safely Compare Function Pointers for Identity in Go?

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

Go では、== または != 演算子を使用して関数ポインタの等価性を比較することは、次のような関数では許可されません。ゼロではありません。この動作により、等価性比較と同一性比較の混合が防止されます。

関数の等価性は関数の同一性とは異なります。 2 つの関数が同じ関数であるかどうかを判断するには同一性比較を使用する必要があり、2 つの関数が同等であるかどうかを判断するには等価比較を使用する必要があります。

Atom の例に示すように、reflect パッケージを使用して関数の同一性を比較します。 、未定義の動作とみなされます。コンパイラは、関数の実装をマージすることで関数を最適化し、比較の信頼性を低くする場合があります。

関数ポインタの同一性を正しく比較するには、関数ごとに一意の変数を作成し、それらの変数のアドレスを比較します。このアプローチにより、最適化に関係なく、同じ関数の関数ポインターを比較することが保証されます。

関数ポインターを比較して同一性を確認する方法の例を次に示します。

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

    // Compare pointers
    fmt.Println(f1 == f1)  // Prints true
    fmt.Println(f1 == f2)  // Prints false
}

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

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