#web服务器html
浏览一个网页就像买啤酒,你给我钱(http请求),我给你啤酒(http返回)
web服务器就充当了营业员的角色
买啤酒从宏观来看,就2步,一手交钱一手交货。其实营业员在给你啤酒以前,还作了其余的事情,好比验钞和查看库存等。而且是有前后顺序的,通常是验钞经过后,再去查看库存。
web服务器也同样,它收到浏览器发来的请求后,会按预约设计的顺序来作一个一个的function,最后将处理的结果返回给浏览器。浏览器拿到返回的内容(html源码),就能够画在屏幕上给用户看了。git
#macaron.Usegithub
Use方法,就是用来注册一个一个的func的,这些func是全局的,也就是任何http请求过来,会最早调用这些func,以此执行。注册的顺序也就是执行的顺序。
Use方法可使用屡次,但每次只能注册一个func。web
m.Use(func(){ println(1) }) m.Use(func(){ println(2) }) // 任何http请求过来,会先打印1,再打印2在控制台上
#macaron.Get浏览器
Get方法也是来注册与上面Use同样的func的,Get方法注册的func 会在 Use注册的func执行完毕后,再依次执行。
Get方法只能使用1次(相同pattern的状况下),能够同时注册1个或n个func,用逗号隔开服务器
m.Get("/",func(){ println(3) }, func(){ println(4) }) // 若是访问的是“/”,会再继续打印3和4在控制台上
到目前为止,尚未注入任何东西,因此只能用macaron.Context.net
m := macaron.Classic() 事实上用经典模式已经帮你注入了一些了。先看成没有注入来看
#开始注入设计
先注入一个Student的structcode
// 这里是Student的定义,之后再也不说了 type Student struct { Id int Name string } func (s *Student) GetName() string { return s.Name } func (s *Student) Job() { fmt.Println("study..") }
注入的func,这里的注入,就至关于注册参数,使用Map的方法来注册参数htm
ctx.Map("arg2") //注册string类型的参数为arg2 ctx.Map(s) //注册Student类型的参数为s(也就是小明的那个实例) // 关于注入,看http://my.oschina.net/u/943306/blog/500237
代码:
func MidStruct(opt string) macaron.Handler { var s *Student if opt == "xm" { s = &Student{Id: 1, Name: "xiao ming"} } else { s = &Student{Id: 1, Name: "xiao wang"} } return func(ctx *macaron.Context) { ctx.Map(s) //关键语句,用于注入struct } }
执行注入
m.Use(MidStruct("xm")) //执行注入动做
使用struct
// 若是以前注入过,那以后就能够取到被注入的struct了 m.Get("/",func(){ println(3) }, func(){ println(4) }, func(s *Student){ //由于以前注入过了,因此这里直接用不会报错 s.Job() //打印完上面的4后,会再打印一行study.. })
这里的最后一个func,就至关于(http://my.oschina.net/u/943306/blog/500237#OSC_h1_9) 里的f2
#完整代码
package main import ( "fmt" "github.com/Unknwon/macaron" ) func main() { m := macaron.Classic() m.Use(MidStruct("xm")) m.Get("/", func(ctx *macaron.Context, s *Student) { fmt.Println(s.GetName()) s.Job() }) m.Run() } func MidStruct(opt string) macaron.Handler { var s *Student if opt == "xm" { s = &Student{Id: 1, Name: "xiao ming"} } else { s = &Student{Id: 1, Name: "xiao wang"} } return func(ctx *macaron.Context) { ctx.Map(s) } } type Student struct { Id int Name string } func (s *Student) GetName() string { return s.Name } func (s *Student) Job() { fmt.Println("study..") }