Go では、関数は第一級の値であり、変数に割り当てたり、引数として他の関数に渡すことができることを意味します。ただし、Go の他の型とは異なり、関数はデフォルトでは比較できません。これにより、コード内の関数を比較しようとするときに混乱が生じる可能性があります。
Go 言語の仕様で詳しく説明されているように、関数の値は比較できません。 == や != などの標準比較演算子を使用して関数値を比較しようとすると、コンパイラ エラーが発生します。
<code class="go">if handler.Post != Undefined { // ... }</code>
コード サンプルにある未定義の関数は、通常の関数と同じ方法で定義されていない関数の例です。これは、単一の文字列引数を受け取り、何も返さない関数として宣言されます (func Unknown(foo string))。次に、init 関数の Handler 構造体の Get フィールドに Unknown が割り当てられます。この代入により、Get フィールドに保存される未定義の関数値が作成されます。
関数自体は比較できませんが、関数値のアドレスを比較することは可能です。これは、fmt.Sprintf 関数を使用して関数アドレスの文字列表現を取得し、結果の文字列を比較することで実現できます。
<code class="go">p1 := fmt.Sprintf("%v", Undefined) p2 := fmt.Sprintf("%v", hand.Get) fmt.Println("Expecting true:", p1 == p2)</code>
このメソッドは、関数の値を効果的に文字列に変換します。 == 演算子を使用して比較します。
関数値のアドレスを比較する別のアプローチは、reflect.Value.Pointer() メソッドを使用することです。 。このメソッドは、反映された値のメモリ アドレスを返し、それを別の関数値のアドレスと比較できます。
<code class="go">u1 := reflect.ValueOf(Undefined).Pointer() u2 := reflect.ValueOf(hand.Get).Pointer() fmt.Println("Expecting true:", u1 == u2)</code>
関数を比較することは通常推奨されません値のアドレス。代わりに、コードをリファクタリングしてそのような比較の必要性を排除する方が、より効率的で保守可能なアプローチです。目的の動作を実現するには、インターフェイスの定義や型アサーションの使用など、別のアプローチの使用を検討してください。
以上がGo で関数を比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。