golang学习———方法别名(1)

前言:本系列文章记录笔者使用golang开发过程中碰到的稍微有点含量的知识点,供大家分享,欢迎拍砖。

    “方法别名”,似乎不太准确,延续C语言中的typedef叫法,在golang中表述如下;

    type  MyFunc  func(string) string

用法1: 为相同的方法签名提供统一的访问入口

    举例,使用golang编写一个http服务器,提供学生管理的基于http的微服务,例如,添加学生、修改学生、删除学生,为此需要开发三个业务方法实现这三个业务逻辑,如下:

               func AddStu(param string) string {

//添加学生逻辑

                        return "ok"

}

  func EditStu(param string) string {

//修改学生逻辑

                        return "ok"

}

  func DelStu(param string) string {

//删除学生逻辑

                        return "ok"

}

我们在一个http请求分发器中调用这三个业务方法,如下:

func handleRequest(w http.ResponseWriter, r *http.Request) {

r.ParseForm()

param := r.Form.Get("param")

var op = r.URL.Path

var resp string

switch op {

case "/add": resp = AddStu(param)

case "/edit": resp = EditStu(param)

case "/del": resp = DelStu(param)

}

w.Write([]byte(resp))

}

在handleRequest方法中,通过switch结果判断请求url的路径来调用相关的业务处理方法,若业务方法由3个增加至30个,上述结构未免过于繁琐,此时可通过“方法别名”解决该问题,首先定义map变量

        myMap := make(map[string]MyFunc, 30)

        然后添加请求路径与对应的业务方法:

        myMap["/add"] = AddFunc

myMap["/edit"] = EditFunc

        myMap["/del"] = DelFunc

       于是我们可以修改上述handlerRequest处理逻辑

           var op = r.URL.Path

          myMap[op](param)

总结: 方法别名,类似于C语言中的函数指针,为所有相同的参数签名的方法提供统一的方法方式,达到代码简化的目的


用法2: 通过方法别名实现接口

例如:有这样一个接口

      type Handler interface {

          func do(param string) string

     }


     如何通过上述方法别名实现该接口呢? 方面别名本质上是一个对象,所以必须为该对象添加一个方法,如下:

    func (f *MyFunc)do(param string) string {

return f(param)

    }

    添加的该方法,实质上是自己调用了本身。 于是,我们可以接口调用该方法别名包装的方法,如:

    var handler  Handler

    handler = Myfunc(AddStu)

    handler.do(param)

   总结:个人感觉通过方法别名实现接口,省去了为所有方法构造对象的麻烦,因为方法别名本身就是一个对象,呵呵!

你可能感兴趣的:(golang)