1 / 9
文档名称:

Martini源码剖析.doc

格式:doc   大小:43KB   页数:9页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Martini源码剖析.doc

上传人:drp539607 2019/7/27 文件大小:43 KB

下载得到文件列表

Martini源码剖析.doc

文档介绍

文档介绍: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。因此他注册一个接口指针类型的空指针