golang中的adapter function type

由于刚刚接触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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock阅读 8,653评论 2 36
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,511评论 25 709
  • 我的梦想是,每天睡到自然醒,在一个阳光明媚的下午,喝喝下午茶,看看喜欢的书,顺便劈劈情操。 没有生活和工作的压力,...
    anMoo韩魔阅读 1,521评论 2 3
  • 课堂上被老师叫到YF,就要踏上社会了你最担心的是什么我说社会上坏人太多了大家哄堂大笑 真实的想法有那么好笑么忘记别...
    忆苦思甜想锦绣阅读 1,027评论 0 1
  • 如果不是那次医院筹钱的无助,让我知道原来姐妹之间也是可以因为金钱而隔阂的,或许陆小曼把朋友看的很重不是没有道理可言...
    傻不愣登的二货阅读 2,286评论 0 0