目次
Go の関数ラッパー
ホームページ バックエンド開発 Golang Go で関数ラッパーを作成して関数の実行前後にコードを挿入するにはどうすればよいですか?

Go で関数ラッパーを作成して関数の実行前後にコードを挿入するにはどうすればよいですか?

Nov 25, 2024 am 05:31 AM

How Can I Create a Function Wrapper in Go to Inject Code Before and After Function Execution?

Go の関数ラッパー

問題ステートメント:
関数を受け入れ、その変更されたバージョンを返す関数ラッパーを探します。このラッパーは、元の関数呼び出しの前後の両方でカスタム コードの実行を挿入することを目的としています。

解決策:
Go では、関数リテラルを利用することでこれを実現できます。特定の関数シグネチャを指定すると、同じシグネチャを持つ関数を受け取り、返すラッパー関数を作成できます。ラッパー関数には、必要なカスタム動作が組み込まれています。

例を考えてみましょう:

func myfunc(i int) int {
    fmt.Println("myfunc called with", i)
    return i * 2
}
ログイン後にコピー

関数の変更と拡張:
次のラッパー関数はログ記録を追加します。元の呼び出しの前後のステートメントmyfunc:

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) // Invokes the provided function
        fmt.Println("After, ret =", ret)
        return
    }
}
ログイン後にコピー

使用法とデモ:
説明するために、ラップされた関数が変数に割り当てられ、実行:

wf := wrap(myfunc)
ret := wf(2)
fmt.Println("Returned:", ret)
ログイン後にコピー

出力:

Before, i = 2
myfunc called with 2
After, ret = 4
Returned: 4
ログイン後にコピー

複数の関数タイプへの拡張:
この概念は、サポートするように拡張できます。個別の型ごとに個別のラッパー関数を作成することにより、さまざまなパラメーターと戻り値の型で関数をラップします。たとえば、パラメーターや戻り値の型を持たない関数をラップする場合:

func wrap(f func()) func() {
    return func() {
        fmt.Println("Before func()")
        f()
        fmt.Println("After func()")
    }
}

func wrapInt2Int(f func(i int) int) func(i int) int {
    return func(i int) (ret int) {
        fmt.Println("Before func(i int) (ret int), i =", i)
        ret = f(i)
        fmt.Println("After func(i int) (ret int), ret =", ret)
        return
    }
}
ログイン後にコピー

以上がGo で関数ラッパーを作成して関数の実行前後にコードを挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

Goでユニットテストをどのように書きますか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

See all articles