Martiniの素晴らしいGo WEBフレームワーク


他のフレームに見られるのは、従来のOOPの影であり、ClassスタイルのOOPをあちこちでエッチングする方法であることが知られている.GoLangにはClassがないことを知っています筆者もGoのスタイルでWEB開発をしようと努力したが、どうも力不足だった.書き出したコードを完全にフレームワークと呼ぶことができず、ソースコードをコピーするためのアプリケーションに似ている.柔軟性を達成するにはソースコードを修正する必要がある.マーティンが見えるまで純粋なGoLangスタイルのフレームワークが登場しました.

コアプロジェクト


InjectorはMartiniの核心です.そのコードは非常に簡潔である.機能は、パケットを反射するだけで、関数のパラメータタイプの自動マッチングを呼び出す.筆者はかつて類似の機能を完成するためにtypelessを書いたが、これは煩雑で高コストの実験品である.Injectorは事を簡単化し、Injectorは関数のパラメータが異なるタイプを持っていると仮定した.WEB開発におけるHandlerFuncは、通常、このような形式を有する.したがって、反射パケットによってパラメータを自動的に整合するHandlerFuncを呼び出すことができ、当然、事前に使用可能なすべてのパラメータMap/MapToをInjectorオブジェクトに与えることは容易であり、予見可能である.

シンプルなルーティング設計


マーティンのルートgoの書くのは非常に簡潔で実用的で、作者が正則を使う功力が非常に深いことを見ることができる.例:
“/wap/:category/pow/**/:id”
一致:"/wap/Golang/pow/Path 1/ToPathN/Foo"

フレキシブルミドルウェア


ここでのミドルウェアとは、一般に、アプリケーションのニーズにおけるプロセス制御、前処理、フィルタ、キャプチャpanic、ログなどを指す.これらは依然としてInjectorが背後に動力を提供する.
ソースコードのClassicMartiniの例を挙げると、もちろん必要に応じて真似することができます.
<!-- lang: cpp -->
func Classic() *ClassicMartini {
    r := NewRouter()
    m := New() // 
    m.Use(Logger()) //  
    m.Use(Recovery()) //   panic
    m.Use(Static("public")) //  
    m.Action(r.Handle) //  
    return &ClassicMartini{m, r}
}

その中でRecovery()とfunc(r*routeContext)run()の組み合わせの方法は非常に読む価値があり、簡単なカウンタで完成した.
martini-contribのwebパッケージはMartiniを通過する方法を示している.Useインタフェースはミドルウェアの設計を行う.新しいHandlerFuncパラメータの種類を加えるのはMapによって完成した.
もし我々がResponseプロセスの制御を完了するならば、ある条件がUseとActionの設定を中断するHandlerに達しない.それは簡単にUseを通じて自分のRecoveryに参加してHandlerを判断して実現することができます
<!-- lang: cpp -->
func Recovery() Handler {
    return func(res http.ResponseWriter, c Context, logger *log.Logger) {
        defer func() {
            if err := recover(); err != nil {
                s, ok := err.(string) //   string, 
                if ok && s == "dont ServerError" {
                        return
                }
                res.WriteHeader(http.StatusInternalServerError)
                logger.Printf("PANIC: %s
%s", err, debug.Stack()) } }() c.Next() } } func MyHandler() Handler { return func(req *http.Request) { if something { panic("dont ServerError") } } } m.Use(Recovery()) m.Use(MyHandler())

さらに
<!-- lang: cpp -->
//   Handlers  
m.Get("/", func() string {
  return "hello world" // HTTP 200 : "hello world"
})
//   handlers  
db := &MyDatabase{}
m := martini.Classic()
m.Map(db) // the service will be available to all handlers as *MyDatabase
// ...
m.Run()

変化と自由度が非常に高い.マーティンが紹介したように
Martini is a powerful package for quickly writing modular web applications/services in Golang.
martiniは素晴らしいwebフレームワークで、驚くほど簡単で、想像しがたい効率です.
はい、これこそ本当のGoLangスタイルです.

Martiniコミュニティコンポーネント


開発者はmartini-contrib組織を設立した.このような管理方式はより開放的である.実際にはこのようにMartini Injectorの風格に合致し、コンポーネント間の依存はInjectorのMap/Invoke機構によって完成することができる.