#上一篇 http://my.oschina.net/u/943306/blog/506905
上一篇介绍了Macaron里的注入Struct,这篇介绍注入interface
二者的区别在于:git
#先上代码github
package main import ( "fmt" "github.com/Unknwon/macaron" ) func main() { m := macaron.Classic() m.Use(MidInterface("laoshi")) //底层使用了MapTo而不是Map了 m.Get("/", func(ctx *macaron.Context, s STUDENT) { //这里要用接口的方式传入,而不能用*Student了 fmt.Println(s.GetName()) s.Job() //上面用的是“laoshi”,因此打印的是teach...,改为“xuesheng”试试结果 }) m.Run() } //新添加的,用于代替MidStruct func MidInterface(opt string) macaron.Handler { var s STUDENT if opt == "laoshi" { s = &Teacher{Id: 1, Name: "xiao ming"} } else { s = &Student{Id: 1, Name: "xiao wang"} } return func(ctx *macaron.Context) { ctx.MapTo(s, (*STUDENT)(nil)) //MapTo用来注册interface } } //MidStruct在这里没有用到,用于和MidInterface比较而保留在此 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) //Map用来注册struct } } //新加一个STUDENT的接口,下面的Student和Teacher都已经实现了该接口 type STUDENT interface { GetName() string Job() } type Student struct { Id int Name string } func (s *Student) GetName() string { return s.Name } func (s *Student) Job() { fmt.Println("study..") } //新加一个Teacher的struct type Teacher struct { Id int Name string } func (t *Teacher) GetName() string { return t.Name } func (t *Teacher) Job() { fmt.Println("teach...") }
#代码分析.net
上一篇只有1个Struct,也就是Student
这里有2个Struct,一个是Student,另外一个是Teacher。这两个Struct都实现了STUDENT这个interfacecode
如今注入的时候用ctx.MapTo(s, (*STUDENT)(nil))
这个方法,来注入。其中第一个参数s
能够是Student,也能够是Teacher。第二个参数是一个接口哦,注意。blog
注册完成后,就能够用了,就是这句m.Get("/", func(ctx *macaron.Context, s STUDENT)
,注意的是,这里是STUDENT,仍是接口。接口
当调用接口上的方法时,s.Job()
会知道这个接口背后是哪一个具体类型,若是是Student,就会打印study...
,若是是Teacher就会打印teach...
get