ホームページ >バックエンド開発 >Golang >Go の `decorator()` 関数は、ジェネリックスなしで特定の戻り値の型を持つ関数を処理できますか?

Go の `decorator()` 関数は、ジェネリックスなしで特定の戻り値の型を持つ関数を処理できますか?

DDD
DDDオリジナル
2024-12-26 19:47:31576ブラウズ

Can Go's `decorator()` function handle functions with specific return types without generics?

Go で任意の関数をパラメータに渡す

Go では、関数をパラメータとして渡すことで、柔軟性が向上し、コードを再利用できます。ただし、異なるシグネチャを持つ関数をパラメーターとして渡そうとする場合には制限があります。

既存の関数をラップできる Decorator() 関数を作成するシナリオを考えてみましょう。単一のパラメータと戻り値を持つ関数(funcA など)の場合、パラメータ タイプとして func(interface{}) Interface{} を使用すると簡単です。

質問: 関数は使用できますか?特定の型(この場合は文字列)を受け入れて返す funcB と同様に、互換性のために func(interface{}) インターフェース型に変換されます。{} decorator()?

答え: 残念ながら、Go ではジェネリックスを使用せずにこれを行うことはできません。その理由は、関数間のパラメーター受け渡しメカニズムの基本的な違いにあります。

たとえば、構造体を引数として受け取る関数は、そのメンバーをそれぞれ個別に受け取ります。逆に、その構造体を含むインターフェースを受け入れる関数は、構造体の型の記述子と構造体へのポインタという 2 つの値を受け取ります。

したがって、目的の動作を実現するには、アダプター関数が必要になります。元の関数のシグネチャと期待される func(interface{}) インターフェースのタイプとの間のギャップを埋めるため。

以上がGo の `decorator()` 関数は、ジェネリックスなしで特定の戻り値の型を持つ関数を処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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