Go 让人吐槽的点之一就是动态特性低,比如不支持泛型、反射鸡肋等等。所以长期以来一直觉得搞一些动态功能是一件很酷的事情。
这里主要做了两件事:
- 运行时获取变量名,并以此为基础做了一个调试工具 XGo/Dumper
- 运行时获取函数签名,以此为基础做了个小类库,可以将任意函数暴露为 http 接口,同时还支持生成 swagger 文档。
中间主要用到了 ast 包的工具(因为想偷懒,也踩了不少坑)。基本思路都是通过 runtime 或 reflect 包,得到一些基本的信息,比如 fileline 和 pc,然后借此再拿到 ast,通过一些上下文信息来定位相关部分的代码,转换为需要的东西。