最近一直在用Go做开发,我们打算整一套和Rails对应的Go开发框架。一些代码在我们的Github小组里有。这里的几个项目都用到了代码生成的方法,生成Go文件,最后的整个web程序被编译成一个可执行文件。 我们正在用一个项目来验证这个想法。其中:
根据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程序还挺简单的。
功能是MVC里面的view engine,从C#里面的razor模仿而来,具体为什么要这么做这个详细的中文文档里面说了。有了这个东西我们可以混着html写Go代码了。我是从这个项目开始正式学习Go的,整个开发过程还是比较顺利的。刚开始lexer大量使用了正则表达式,后来发现速度有些受影响就手动写了一部分。parser部分现在还有些难看,后面继续重构一下。Debug一直都是Println,很多时候已经够用了。
在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上手教程: