2017-07-26 14 views
0

golangに新しく追加されました。任意の型を許可し、次の層のメソッドを呼び出します。Golangマイクロサービスミドルウェアは任意のタイプを許可しますが、エンドポイントは厳格にしてください

ロギングミドルウェアパッケージの下で、私はどんなタイプを受け入れてそれを印刷したいと思っています。

package loggingmiddleware 

import (
    "context" 
    "time" 

    gokitlogger "github.com/go-kit/kit/log" 
) 

type layer interface { 
    Run(context.Context, interface{}) (interface{}, error) 
} 

type LoggingMiddleware struct { 
    Logger gokitlogger.Logger 
    Layer layer 
} 

func (mw LoggingMiddleware) Run(ctx context.Context, i interface{}) (output interface{}, err error) { 

    defer func(begin time.Time) { 

     mw.Logger.Log(
      "method", "name of method", 
      "input", i, 
      "output", output, 
      "err", err, 
      "took", time.Since(begin), 
     ) 

    }(time.Now()) 

    output, err = mw.Layer.Run(ctx, i) 
    return 

} 

しかし、私はそれが私が文字列ではなく、私の例ではinterface{}

するタイプを設定したい文字列にする必要がある場合、私は確かだけにしたい、次のメソッドを呼び出すときに厳密になりたいですfloat64タイプは...引数私の現在の実装で、私はこのエラーを取得していますとしかし

type mathServiceInterface interface { 
    Run(context.Context, float64) (float64, error) 
} 

type mathService struct{} 

func (mathService) Run(_ context.Context, f float64) (float64, error) { 
    return f * f, nil 
} 

として使用されます

# github.com/jakelacey2012/blankit/blankit-ms/sqaure 

./main.go:92: cannot use ms (type mathServiceInterface) as type loggingmiddleware.layer in field value: 
     mathServiceInterface does not implement loggingmiddleware.layer (wrong type for Run method) 
       have Run(context.Context, float64) (float64, error) 
       want Run(context.Context, interface {}) (interface {}, error) 

./main.go:92: cannot use loggingmiddleware.LoggingMiddleware literal (type loggingmiddleware.LoggingMiddleware) as type mathServiceInterface in assignment: 
     loggingmiddleware.LoggingMiddleware does not implement mathServiceInterface (wrong type for Run method) 
       have Run(context.Context, interface {}) (interface {}, error) 
       want Run(context.Context, float64) (float64, error) 

私はこのエラーを理解していますが、実装が複雑であるかどうかはわかりません。なぜなら、わからないからです。

私が言っていることが意味を成し遂げたいと思っていますが、私はこれをどのようなものにするべきか分かりませんでしたので、自由に編集してください。

さらに詳しい説明が必要な場合は、私に知らせてください。

答えて

1

これは何と呼びますか?ある時点では実際の消費者がおり、その消費者はおそらくあなたのコードに基づいてインタフェース(layerまたは同一のインタフェース)を使用しています。ミドルウェアがある場合、そのインターフェイスはは必然的にミドルウェアと同じになります。つまり、Runにパラメータとしてinterface{}をとります。実際のコンシューマにはより具体的なインターフェイスが表示されません。具体的にはRun(Context,interface{}) (interface{},error)が表示されます。

+0

私はあなたが言っていることに従っていると思います。私が具体的にするつもりなら、私はミドルウェアでもそれをする必要があります。私がいれば、私は持っているすべての異なるインターフェース用に異なるロガーミドルウェアを作成する必要がありますか? –

+0

はい、そうするか、それを一般的なものにします。 – Adrian

+0

あなたは何をしますか? –

1

エラーメッセージには、タイプをインターフェイスに実装するには、メソッドがと一致する必要があります。インターフェイスで定義されているメソッドと完全に一致している必要があります。

悲しいことに、これはシステムが設計どおりに動作しないことを意味します。 interface{}を使用してエンドポイントの実際のタイプにアサーションするか、タイプごとに別のインターフェイス(およびロガー機能)が必要になります。

+0

私はちょうど効果的に(私の頭の中で)答えるために同じコードになるロガーの関数を書くことを避けるために意味を意味しています。 –

関連する問題