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 回だけですが、コンパイラーに依存して、必要なすべての型に合わせてカスタマイズされた関数を生成します。
関数の場合、次の操作を行います:
リーリー
基本的に、汎用の
および r
型を、update
関数で使用される特定の型に置き換えます。この方法でラップしようとしている関数が実際にはわからないため、t any, r any
を使用しましたが、ある種のリクエストハンドラーをラップしようとしているように見えるため、独自の制約を作成できます:
リーリー
を [t リクエスト, r レスポンス]
に置き換えるだけです。
以上がGolang デコレータ関数にはどのようなパラメータがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。