ホームページ  >  記事  >  バックエンド開発  >  Golang デコレータ関数にはどのようなパラメータがありますか?

Golang デコレータ関数にはどのようなパラメータがありますか?

WBOY
WBOY転載
2024-02-08 23:09:391418ブラウズ

Golang 装饰器函数的哪些参数

php エディタ Baicao は、Golang デコレータ関数のパラメータを紹介します。 Golang では、デコレーター関数は、他の関数をラップし、追加の機能を追加するために使用できる特別な関数です。デコレータ関数には通常、元の関数、デコレータ関数のパラメータ、戻り値の 3 つのパラメータがあります。元の関数は、装飾が必要な関数です。デコレータ関数のパラメータは任意の型にすることができ、デコレータ関数に追加のパラメータを渡すために使用できます。通常、戻り値は、元の関数の実行を置き換える関数です。関数。これらのパラメーターを通じて、さまざまな柔軟なデコレーター モードを実装し、関数にさまざまな関数を追加し、コードの再利用性とスケーラビリティを向上させることができます。

質問内容

adminapiのいくつかのメソッド(updateなど)でsetterを使用したいと考えています。これを行うために、他のメソッドと一致するメソッド タイプを作成しました。

func type の代わりにインターフェイスを使用する必要がありますか?

リーリー
type adminapi struct {
}

type toadminctx func(ctx context.context, req interface{}) (interface{}, error)

func (a adminapi) adminm2msetter(s toadminctx) toadminctx {
    return func(ctx context.context, arg interface{}) (interface{}, error) {
        m2mprincipal, _ := a.getm2mprincipal(ctx)
        ctxm2m := extlib.setprincipal(ctx, m2mprincipal)
        return s(ctxm2m, arg)
    }
}

func (a adminapi) update(ctx context.context, req *reqtype) (resptype, error) {}

解決策

発生しているエラーは一目瞭然だと思います:

リーリー

電話をかける

リーリー

パラメータとして s.adminapi.update を渡します。予期されるタイプは toadminctx です。型定義は次のとおりです:

リーリー

ただし、update 関数の 2 番目のパラメーターは *reqtype で、最初の戻り値は resptype 値であるため、update toadminctx ではありません。 toadminctx 関数タイプは、コンテキストおよび 文字通り任意のタイプ を使用して呼び出すことができる関数です。 update 関数は、toadminctx 関数が動作するすべての場合に動作することが保証されません。

あなたが探しているのは、任意の関数を「ラップ」し、ctx パラメーターに何らかの作業を追加して (おそらく値を設定して)、呼び出しを渡す方法です。 go 1.19 より前では、次のようなラッパー タイプを追加することでこれを行っていました。 リーリー

ラッパー パラメーター タイプを受け取るように、

update 関数などのすべての関連関数を変更します。 リーリー 応答タイプも同様にラップされたり結合されます。

Go がジェネリックスをサポートするようになったので、このケースでは非常に便利です。

adminm2msetter

関数を次のように変更しましょう: リーリー このように、この関数を定義する必要があるのは 1 回だけですが、コンパイラーに依存して、必要なすべての型に合わせてカスタマイズされた関数を生成します。

update

関数の場合、次の操作を行います: リーリー 基本的に、汎用の

t

および r 型を、update 関数で使用される特定の型に置き換えます。この方法でラップしようとしている関数が実際にはわからないため、t any, r any を使用しましたが、ある種のリクエストハンドラーをラップしようとしているように見えるため、独自の制約を作成できます: リーリー

[t any, r any]

[t リクエスト, r レスポンス] に置き換えるだけです。

以上がGolang デコレータ関数にはどのようなパラメータがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。