Go で任意の関数をパラメータとして渡す
Go で関数をパラメータとして渡すと、コードを動的に作成して実行できます。ただし、渡せる関数の種類には制限があります。
次のシナリオを考えてみましょう。1 つのパラメータを受け入れ、1 つの値を返す任意の関数をラップできるデコレータ関数を作成したいと考えています。 Interface{} 型を受け入れる関数または返す関数を処理するには、引数として func(interface{}) Interface{} を使用してデコレータ関数を定義できます。
ただし、func 型の関数を変換することはできません。 (string) 文字列を func(interface{}) インターフェイスの型に暗黙的に変換します。{}これは、パラメーターと戻り値の型の仕組みが関数ごとに異なるためです。 Interface{} 引数を渡すことは、すべての型との互換性を保証するものではありません。
たとえば、引数として構造体を受け入れる関数は、その構造体の個々のメンバーを受け取ります。対照的に、その構造体を含むインターフェースを受け入れる関数は 2 つの単語を受け取ります。1 つは型、もう 1 つは構造体へのポインタです。
Solution
ジェネリックがなければ、この機能を直接実現する方法はありません。ただし、回避策としてアダプター関数を使用できます:
// Adapter function for func(string) string to func(interface{}) interface{} func adapter(inner func(string) string) func(interface{}) interface{} { return func(arg interface{}) interface{} { // Convert the interface{} arg to a string argString := arg.(string) // Call the inner function with the converted string result := inner(argString) // Return the result return result } }
今度は、アダプター関数を使用して funcB をデコレータに渡すことができます:
fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))
以上が型互換性の制限を考慮して、Go で任意の関数をパラメータとして渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。