mitaparvin 发表于 2023-10-2 15:35:22

以 Kubebuilder 风格生成 Go 代码

本帖最后由 mitaparvin 于 2023-10-3 12:24 编辑


代码生成是根据某种抽象描述生成代码的过程。虽然这不是一个非常形象的描述,但几乎每个人都对代码生成有某种理解。例如,在云原生生态系统中,从 Protobuf 或 OpenAPI 描述符生成代码是很常见的。 然而,代码生成远不止于此。除了具体的、(非常)高级的定义语言之外,程序代码也是这样的抽象描述。 例如,当编译器将用高级编程语言编写的程序代码翻译成机器代码时,实际上会发生基于代码生成代码的 情况。编译器解析代码,优化它,然后生成一组我们的计算机可以理解的指令。

高级编程语言的存在,使我们不必直接与机器对话。与机器交谈很乏味,因为它的工作方式与人脑不同。 同样,我们也不能很好地处理重复的事情。至少在计算机工程中,如果某件事需要多次完成,我们希望将其自动化。我们发明了很多工具来 电话号码列表 帮助我们避免重复代码,从可重用库到 参数多态性 (通常称为泛型)。 如果我们也可以自动化编写代码怎么办?换句话说:如果我们以从代码生成代码(使用相同的语言)怎么办? 在这篇文章中,您可以了解如何使用与 Kubebuilder 使用的相同工具生成 Go 代码。作为一个例子,我们将为结构实现一个浅复制生成器(它本身没有多大意义,但可以作为一个很好的例子)。


https://zh-cn.cubdirectory.com/wp-content/uploads/2023/10/mim-300x150.png

生成Go代码 生成代码(经过一些简化)可以分为两个阶段: 解析输入并将其转换为中间表示 从该表示生成实际代码 中间表示可以有所不同,但它可以像函数的一组参数一样简单。重要的是在解析器和代码生成器之间有一个充当“DTO”的中间层,这样它们就不会直接相互依赖。 对于实际的代码生成,Go 中有几种常见的解决方案。它们实际上并不是 Go 特有的(即相同的想法也可以应用于其他语言),但我想向您展示如何在 Go 中做到这一点。 第一种(可能也是最简单的)方法是模板化。几乎每种语言都有自己的模板解决方案(内置版本或用户态版本)。

页: [1]
查看完整版本: 以 Kubebuilder 风格生成 Go 代码