Macaron的注入interface

#上一篇 http://my.oschina.net/u/943306/blog/506905
上一篇介绍了Macaron里的注入Struct,这篇介绍注入interface
二者的区别在于:git

  1. 使用方法不一样,注入Struct用的是Map,而注入interface的是MapTo
  2. 注入Struct的话,只能用该类型的Struct,而注入interface的话,能够用任何实现interface的Struct

#先上代码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

相关文章
相关标签/搜索