Go の関数ラッパー: 関数実行へのコードの挿入
関数ラッパーを作成すると、開発者は関数の前後にコードを挿入して既存の関数を強化できます。実行。 Go では、この手法では、ラップされる関数のシグネチャを知り、同じ型の関数値を返す必要があります。
次の例では、関数 f を受け入れるラッパー関数 Wrap を定義します。ラップでラップされた新しい関数を返します。この新しい関数は f と同じシグネチャを持ちます。 f の実行前後に、wrap はメッセージをコンソールに出力します。
func wrap(f func(i int) int) func(i int) int { return func(i int) (ret int) { fmt.Println("Before, i =", i) ret = f(i) fmt.Println("After, ret =", ret) return } }
これを説明するために、入力数値を 2 倍にする myfunc という関数があります。
func myfunc(i int) int { fmt.Println("myfunc called with", i) return i * 2 }
myfunc を Wrap 関数でラップすることで、独自の関数を追加できます。 function.
wf := wrap(myfunc) ret := wf(2) fmt.Println("Returned:", ret)
出力:
Before, i = 2 myfunc called with 2 After, ret = 4 Returned: 4
複数の関数タイプのサポート
Go にはジェネリックがないため、特定のラッパー関数を作成する必要がありますサポートされる関数の種類ごとに。あるいは、reflect.MakeFunc() を使用して複数の関数タイプを処理するラッパー関数を作成することもできますが、この方法では複雑になる可能性があります。
パラメーターや戻り値のない関数の場合は、ラップ関数を少し変更できます。
func wrap(f interface{}) interface{} { switch f2 := f.(type) { case func(i int) (ret int): // ... case func(): // ... } return nil }
結論として、Go の関数ラッパーは、ソース コードを変更せずに既存の関数の動作を変更する手段を提供します。開発者はこれらのラッパーをカスタマイズして、特定の要件を満たし、コードの柔軟性を高めることができます。
以上がGo の関数ラッパーは関数の実行前後にコードをどのように挿入できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。