golang中的adapter function type

Jale · · 1338 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

由于刚刚接触golang,对语言和用法都不太熟,看到这种写法感觉很奇怪:

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

type HandlerFunc func(ResponseWriter, *Request)

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
     f(w, r)
}

我内心就觉得为啥要这么多此一举呢?把一个func定义为一个类型,然后实现ServeHTTP函数。为啥不直接用那个函数呢?

来看看http.ListenAndServe()接口的原型就明白了:

func ListenAndServe(addr string, handler Handler) error

函数的第二个参数是一个Handler interface,也就是说要使用这个函数那么需要传入一个实现了ServerHTTP函数的类型。

对于复杂的应用来说可能会专门定义一个struct来实现http.Handler接口,那么就传入这个struct的事例进去就行了。但是如果简单的应用也这么做就有点划不来了,因此http包提供了HandlerFunc类型来辅助用户将一个函数快速转换为符合http.Handler接口的类型。这种方法叫adapter function type[1]

这种技巧的关键就是将符合接口的函数定义为类型,然后对这个类型实现接口中的函数,实现的时候就直接调用自身。使用的时候只需要将自定义的函数(原型相同)做类型转换就完成了。

实际上不光是标准库用到这样的技巧,在很多golang初学者都会看的groupcache中也用到了[2]

参考

[1] https://github.com/gopherchina/conference/blob/master/2017/1.3%20Go%20coding%20in%20go%20way.pdf

[2] https://github.com/golang/groupcache/blob/master/groupcache.go


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Jale

查看原文:golang中的adapter function type

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

1338 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传