最近一直在用 Go 做开发,我们打算整一套和 Rails 对应的 Go 开发框架。一些代码在我们的Github 小组里有。这里的几个项目都用到了代码生成的方法,生成 Go 文件,最后的整个 web 程序被编译成一个可执行文件。
我们正在用一个项目来验证这个想法。其中:
1. xuanwu(玄武)
根据 thrift 文件产生对应 MVC 里面的 Model。生成的 go 文件里面,一个 thrift 类型对应一个 go 里面的 type struct,生成的代码中包含一些基本的方法,比如 FindByID 等等,这都是根据 thrift 文件定义的对象属性自动生成的。这里用到了ptsd来解析 thrift 文件,自己定义模板来生成 Go 代码。我后来加了crud.py和crud.tmpl来生成 Controller 的代码,这样 MVC 里面 Model 和 Controller 就都有了。不过对于 Go 这样的静态语言,生成代码这套方案有个难解决的问题就是如何在生成的代码基础上实现用户自定义。我们现在的解决办法是另外写一个对应的 fix 文件,在里面写入自己要重写的函数,另外写一个程序根据 gen 文件和 fix 文件来做一个基于函数定义的 diff,如果用户定义了就忽略自动生成的函数。好绕的方法,不过因为 Go 库里面自带的的 parser 和 AST,做这么一个 diff 程序还挺简单的。
2. gorazor(白虎)
功能是 MVC 里面的 view engine,从 C#里面的 razor 模仿而来,具体为什么要这么做 这个详细的中文文档 里面说了。有了这个东西我们可以混着 html 写 Go 代码了。我是从这个项目开始正式学习 Go 的,整个开发过程还是比较顺利的。刚开始 lexer 大量使用了正则表达式,后来发现速度有些受影响就手动写了一部分。parser 部分现在还有些难看,后面继续重构一下。Debug 一直都是 Println,很多时候已经够用了。
3. web
在 web.go 的基础上做了一些自己的修改。
再说一下使用 Go 的一些感受,大部分时候是很爽的
。对于喜欢 C 和 Python 的人来说上手 Go 是很容易的事情。Go 更像是一个更现代化的 C(而不是 C++),因为简洁是其一个重要特性。和 Python 相似的地方是提倡一种事有一种解决方法,而不像 Ruby 那样有各种魔法写法,所以看别人的代码容易一些。Go 对代码的格式化有一些强制约定,但是缩进并不是语法的一部分,而是通过 gofmt 工具来自动纠正格式,这太方便了。再加上 goimport 这样的工具来自动加上或者移除不必要的 import,我现在写 Go 代码的时候基本不需要关心格式和 import 这些琐事,绑定 Emacs 快捷键保存文件以后基本都解决了。
Go 的编译速度很快
,我的机器上这里 20w 行左右的 Go 代码基本编译在 13s 左右,这和 C++ 比起来要快很多很多。
其他
其中 go-autocomplete 是来自动补全的,对于内置的库函数补全还是很好的。有的自定义的补全不出来。
goimports 修正 import 的。
gocover 是我自己写的一个程序,看到同事写在 Vim 里写 Go 代码的时候一个快捷键就跑相关的 pkg 的 testing,并把结果打印出来。对于 Go 的这么快的编译速度,真的可以边写代码迅速按下快捷键测试的结果就出来了 (还包括 coverage 噢)。于是我也写了个程序分析出当前编辑文件对应的 package 名字,设定好 GOPATH,然后去 tmp 目录跑测试。这个程序就是gocover,我绑定到C-x g
,太方便了。
Vim 和 Emacs 的可扩展,是我们这群装逼党依然坚持用这些老古董的原因。
因为可扩展意味着将来要面对新的编程语言和环境时候,我们可以做出自己改变来适应。
好的 Go 上手教程: