能做什么?
假设现在有一个请求,请求会带一个参数event,要根据不同的event实现对应的处理逻辑
那么我们就可以用到接口编程了
示例
http请求入口
//入口
func (i *IndexCtl) Index() {
//接收http请求参数
params := i.Input()
//判断是否有event参数
if _, ok := params["event"]; !ok {
log.Fatal("param is err")
}
logic := &logics.IndexLogic{}
//调用业务逻辑
err := logic.Analysis(params)
}
logic
IndexLogic.go
//IndexLogic.go
package logics
import (
"net/url"
)
type IndexLogic struct{}
//业务逻辑入口
func (i *IndexLogic) Analysis(params url.Values) (err error) {
var event string
//获取到event
event = params["event"]
//根据event获取对应的处理逻辑
ins, err := GetInstance(event)
if err != nil {
return
}
//真正的处理逻辑开始处理请求
ins.Computing(params)
return
}
test.go
package logics
import (
"net/url"
)
type Test struct{}
func init() {
//将Test注册到 Instance.go 中的 adapters
SetInstance("test", newRegister)
}
func newRegister() DoComputing {
return &Test{}
}
// Test 定义一个Computing 实现了Instance.go 中DoComputing接口
func (r *Test) Computing(params url.Values) {
fmt.Println("test")
}
test1.go
package logics
import (
"net/url"
)
type Test1 struct{}
func init() {
//将Test1注册到 Instance.go 中的 adapters
SetInstance("test1", newRegister)
}
func newRegister() DoComputing {
return &Test1{}
}
// Test1 定义一个Computing 实现了Instance.go 中DoComputing接口
func (r *Test1) Computing(params url.Values) {
fmt.Println("test1")
}
Instance.go
package logics
import (
"net/url"
"log"
"errors"
)
//定义 Instance 是一个 DoComputing类型的方法
type Instance func() DoComputing
//定义一个DoComputing的接口
type DoComputing interface {
//接口包含一个Computing方法
Computing(params url.Values)
}
//声明用来存放各event实例的变量
var adapters = make(map[string]Instance)
//注册event示例
func SetInstance(name string, adapter Instance) {
if adapter == nil {
log.Println("adapter is nil")
return
}
if _, ok := adapters[name]; ok {
log.Println(name + " adapter is not found")
return
}
//如果实例没有问题 存入全局的adapters中
adapters[name] = adapter
}
//获取event实例
func GetInstance(adapterName string) (adapter DoComputing, err error) {
instance, ok := adapters[adapterName]
if !ok {
err = errors.New(adapterName + " adapter is not found")
return
}
//event实例存在于adapters中 返回实例
adapter = instance()
return
}
这样当我们请求参数 event=test 就会输出 test,event=test1 就会输出 test1
再多的event我们的代码都会一样的清晰