ホームページ > バックエンド開発 > Golang > 型互換性の制限を考慮して、Go で任意の関数をパラメータとして渡すにはどうすればよいですか?

型互換性の制限を考慮して、Go で任意の関数をパラメータとして渡すにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-03 09:16:39
オリジナル
427 人が閲覧しました

How Can I Pass an Arbitrary Function as a Parameter in Go, Considering Type Compatibility Limitations?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート