ホームページ >バックエンド開発 >Golang >標準の比較演算子が機能しない場合、Go で関数を比較するにはどうすればよいでしょうか?

標準の比較演算子が機能しない場合、Go で関数を比較するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 07:27:01457ブラウズ

How can you compare functions in Go if standard comparison operators don't work?

Go での関数の比較

Go では、標準の比較演算子を使用して 2 つの関数の値を比較することは実現できません。ただし、関数が同等かどうかを確認するための代替方法があります。

関数アドレスの使用

関数の値自体は比較できません。代わりに、関数値のアドレスを比較して、それらが同じ関数を参照しているかどうかを判断できます。関数のアドレスを取得するには、fmt パッケージの Sprintf("%v") 関数を使用できます。

<code class="go">hand := &Handler{Undefined, Defined}
p1 := fmt.Sprintf("%v", Undefined)
p2 := fmt.Sprintf("%v", hand.Get)

if p1 == p2 {
    // Undefined and hand.Get refer to the same function.
}</code>

reflect.Value を使用する

別のアプローチは次のとおりです。基になる関数ポインターを取得するには、reflect.Value 型を使用します。これはまさに fmt パッケージが内部的に行うことです。

<code class="go">value := reflect.ValueOf(Undefined)
ptr := value.Pointer()</code>

その後、ptr 値を比較して関数が等しいかどうかを判断できます。

注意

ただし、関数アドレスの比較は、すべてのシナリオで信頼できる方法ではないことに注意することが重要です。関数クロージャと動的に生成された関数は、同じタスクを実行する場合でも、異なるアドレスを持つ可能性があります。

したがって、一般的には、関数アドレスの比較を避け、代わりに関数の動作を比較するための代替アプローチを検討することをお勧めします。出力値。

以上が標準の比較演算子が機能しない場合、Go で関数を比較するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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