文档介绍:martini是非常优雅的GoWeb框架。他基于依赖注入的思想,仿照Sinatra的路由设计,参考Express的中间件设计,而且核心微小,扩展方便,非常值得学****但是由于本身API设计简洁,使很多细节无法从代码理解。所以,我写一点笔记记录martini的工作方式。Martini核心我们从最简单的官方实例入手:packagemainimport"/go-martini/martini"funcmain(){m:=()("/",func()string{return"Helloworld!"})()},负责完成依赖注入和调用的过程。,实现路由分发和逻辑调用的过程。m:=()。#L104:lassic()*ClassicMartini{r:=NewRouter()m:=New()(Logger())(Recovery())(Static("public"))(r,(*Routes)(nil))()return&ClassicMartini{m,r}}里面的m:=New()#L38:ew()*Martini{m:=&Martini{Injector:(),action:func(){},logger:(,"[martini]",0)}()(defaultReturnHandler())returnm}依赖注入上面很明显的看到两个奇特方法:()、()。这里,需要注意martini的一个最重要原则,注入的任何类型的结构,都是唯一的。即如:typeUserstruct{Idint}(&User{Id:1})(&User{Id:2})martini在寻找&User类型的时候,只能获取到&User{Id:2}结构(最后注册的)。Map的作用,就是向内部注册对应类型的具体对象或者值。。()(*)和defaultReturnHandler()(括号中是类型索引)注入到内部。这里出现了一个问题。接口这种类型,()直接获取的(因为传来的都是已经实现接口的具体结构)。()。(r,(*Routes)(nil))即将r()(注意大小写)类型注入到内部。(*Routes)(nil)也是高明的构造。接口的默认值不是nil,无法直接new。但是指针的默认值是nil,可以直接赋值,比如varuser*User;user=nil。因此他注册一个接口指针类型的空指针