2017-03-11 5 views
0

としての機能パッケージvalyala/fasthttpは、次の関数型を実装:Golang:引数、アクセス内部パラメータ(fasthttp)

type RequestHandler func(ctx *RequestCtx) 

それは、このようなbuaazp/fasthttprouterで使用されています

func (r *Router) Handle(method, path string, handle fasthttp.RequestHandler) { 
    //... 
} 

私がしようとしていますこれを次のように包んでください(実装上の提案があります):

//myapp/router 

type Request struct { 
    fasthttp.RequestCtx 
} 

type RequestHandler func(*Request) 

func Handle(method string, path string, handler RequestHandler) { 
    //I need to access the fasthttp.RequestCtx stuff in here... 
} 

どうしたらいいですか?あるいは、これがまったくいいことではない場合は、ルータパッケージについて下記のように私の目標をどのように達成することができますか?


背景

目標:私の願いは、これらのパッケージの実装に私のアプリはとらわれないようにするためにツーリングパッケージ(セッション、データベース、ルーティングなど)をラップすることです。私はこれを主にドメイン固有の機能で拡張し、サードパーティ製のlibを別のものに切り替えることができるようにするために、これをやりたいと思っています。また、デバッグとロギングも容易になります。

:インポートされたパッケージの機能に対応するネイティブの型と関数を作成します。

問題:私は正常に(すなわち輸入)の外国関数型をラップする方法について立ち往生しています。

答えて

0

あなたのアイデアはとてもよく見えます。あなたが変えることができるいくつかのもの:

//myapp/router  

// Using a composition is idiomatic go code 
// this should work. It can't get better. 
type Request struct { 
    fasthttp.RequestCtx 
} 

// I would make the RequestHandler as a real Handler. In go it would be 
// a interface 
type RequestHandler interface{ 
    Request(*Request) 
} 
// If you have a function, which needs to access parameters from `Request` 
// you should take this as an input. 
func Handle(method string, path string, req *Request) { 
    //Access Request via req.Request ... 
} 

ので、あなたは、関数やRequestは、入力として、発信者は、彼があなたのハンドル関数を呼び出す前に、それを作成する必要も必要あなたの関数に変換するインターフェースを渡す場合。なぜあなたは本当に必要な入力のためだけにその機能を変更しないのですか?

+0

私は、パッケージの実装を模倣するための引数として関数を渡しました。 net/httpでは、 'func Route(w http.ResponseWriter、r * http.Request){}'はbuaazp/fasthttprouterの 'func Route(ctx * fasthttp.RequestCtx){}'です。関数型を省略した場合、この実装の下でどのようにルートを宣言する必要がありますか? –

+0

申し訳ありません私はあなたを理解していませんでした。したがって、サーバーとしてfasthttpを使用し、これを経路用のfasthttprouterと組み合わせたいとします。私は正しい? – apxp

+0

はい、ただし、アプリケーションの残りの部分は見えません。私は_myapp/router_に他のパッケージが_myapp/router_のみをインポートするように、サードパーティーのインポートをすべて_myapp/router_にラップしたいと思います。私の問題は、インポートされたパッケージのシグネチャタイプで_handlerFunctions_としてフォーマットされているので、ルートを宣言することにあります。これは、私の前のコメントと同じように書式設定されていることを意味します。理想的には、私は 'router.GET(path string、ctx router.Context){}'または 'router.GET(path string、func(ctx router.Context){}'としてルートを宣言できるようにしたいと思います。これらをfasthttprouterの実装にマップします。 –

関連する問題