ホームページ >バックエンド開発 >Golang >手動でラップせずに、特定のシグネチャを持つ関数を Go デコレーターに渡すにはどうすればよいですか?

手動でラップせずに、特定のシグネチャを持つ関数を Go デコレーターに渡すにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-24 06:41:11168ブラウズ

How Can I Pass Functions with Specific Signatures to a Go Decorator Without Manual Wrapping?

Go で特定のシグネチャを持つ関数を渡す

Go では、関数ポインタをパラメータとして渡すことができ、コードを再利用するための強力なメカニズムを提供し、柔軟性。一般的な使用例の 1 つは、他の関数をラップして動作を強化する関数であるデコレーターを使用することです。ただし、特定のシグネチャを持つ関数を渡そうとすると、特定の制限が発生します。

次のシナリオを考えてみましょう。任意の関数をラップする、decorator() という名前のデコレーターを作成したいとします。話を簡単にするために、パラメータを 1 つだけ取り、単一の値を返す関数を扱っていると仮定します。

1 つの方法は、任意の関数を受け入れるために、decorate() を func(interface{}) インターフェースとして定義することです。{}これはインターフェースを受け取り、インターフェースを返します。{}これは、(funcA の例のように)内部関数がインターフェイス{} タイプも処理する場合にはうまく機能します。

しかし、疑問が生じます。funcB(string) string のような既存の関数をシームレスに変換することは可能ですか。これは文字列を受け取り、匿名関数で手動でラップせずに、decorate() と互換性のある形式で文字列を返します?

関数の制限事項変換

残念ながら、Go ではそのような変換を実行することはできません。これは、関数でパラメータを渡す方法の基本的な違いに起因します。引数として構造体を受け入れる関数は個々のメンバーを受け取りますが、構造体を含むインターフェイスを受け入れる関数は構造体の型とその構造体へのポインターを受け取ります。

ソリューションとしてのアダプター関数

ジェネリックスを使用しない場合、この変換を実現する唯一の方法はアダプター関数を使用することです。これらの関数は仲介者として機能し、元の関数とデコレーターの必要な署名の間のギャップを橋渡しします。アダプター関数は、元の関数を呼び出す前に、元の関数の引数をインターフェースに変換します。

アダプター関数を利用することで、開発者はデコレータの機能を拡張して、特定のシグネチャを持つ関数に対応し、コードの再利用性と拡張性を促進できます。アプリケーションで。

以上が手動でラップせずに、特定のシグネチャを持つ関数を Go デコレーターに渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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