最近陆续看了golang的Martini框架,也试用了,这个山寨自node.js的Express框架和最新的koa框架的golang框架,node
一样具备低耦合的特色,不过仍是担心其性能,由于核心采用了reflect反射技术。golang
golang的http包用Hander、handerfuc这些来解决中间件的问题,好比说验证,日志等,采起的是一层层封装的方式,web
比如洋葱。这样写出来的代码的缺点是耦合度高。若是中间件的顺序或者名字变换,则有不少代码须要改动。数组
为了下降依赖,则需让代码不要直接引用前一层的名称,加入第三方的一个间接层。reflect可行,可是reflect反射是基于对对象绝不了解,采起笨办法逐步找出对象类型(结构体)的各个函数的名称而后调用。数据结构
若是采起如下方法彷佛能够更好解决这个问题:并发
每一个待添加的组件都遵照一个简单的接口约定,好比将须要导出为外界调用的函数都保持在一个相似函数指针数组的数据结构中,这样,框架对于要启用的组件会知道如何去利用,有利于二者的协同。而后,若启用该组件,则可将这个数组和别的组件的数组放在一块儿,web应用依次调用。这种比较底层的方式,效率或者能够更高。框架
为进一步考虑提升效率,若组件运行时间比较长,可采用gorutine + channel 的方式,来达到各个中间件filter 模式并行执行的效果? golang的net/http底层已经采用了gorutine处理并发链接,不知会不会冲突?koa
koa框架核心的co是基于ES6新规范中的yield关键字来实现协程的效果,这点和gorutine + channel比较相似。函数