ホームページ > バックエンド開発 > Golang > Go の関数ラッパーは関数の実行前後にコードをどのように挿入できますか?

Go の関数ラッパーは関数の実行前後にコードをどのように挿入できますか?

Susan Sarandon
リリース: 2024-11-29 10:52:09
オリジナル
597 人が閲覧しました

How Can Function Wrappers in Go Inject Code Before and After Function Execution?

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

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