golang接口编程

能做什么?

假设现在有一个请求,请求会带一个参数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我们的代码都会一样的清晰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值