前言:本系列文章记录笔者使用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)
总结:个人感觉通过方法别名实现接口,省去了为所有方法构造对象的麻烦,因为方法别名本身就是一个对象,呵呵!