推荐下我修改的gen
Sun, Mar 2, 2014gen
是go的代码生成器, 提供类似于underscore
的函数集.
尝试将gen
用在项目上,发现不太方便,对源码做了如下两个修改, 修改后的代码在这里:
支持条件编译
go提供了条件编译,根据GOOS
和GOARCH
进行交叉编译,也可以利用build tags
自定义条件编译
修改前可能碰到的问题是存在a_linux.go
和a_windows.go
, 分别定义一个函数A
的两个版本. 调用gen
时会报错:A
不可以重复定义
这个修改已经被merge回原分支
对于import的其它包, 支持分析其源码
设想一个场景, 存在root/A
和root/B
两个包, root/B
import root/A
在root/B
上调用gen
, gen
会分析import关系, 找到并分析root/A
在修改之前, 由于gen
只使用了types.Check
, 默认只会使用gcimport
,只分析root/A
编译好的pkg(.a
文件), 而不包括root/A
的源码.
也就是说对于所有依赖, 必须都保证其跑过go install
, 才能在下游模块使用gen
. 这个并不方便
做的修改是使用go.tools/importer
代替gcimporter
, 既可以分析编译好的pkg, 又可以分析源码
不过这个修改的代价是分析的时间会比较长
这个修改尚未被原分支接受
types
源码分析的一个问题
以下代码在分析源码时报错, 但编译时是通过的
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTTIN)
分析时报的错是
cannot pass argument c (variable of type chan os.Signal) to parameter of type chan<- os.Signal
目前无解, 但结论是用types
包进行的源码分析结果和编译时的略有差异