「码上掘金迎新年」代码生成器,我是这么写的

2,242 阅读5分钟

f0a2c81864c2cde7fff65b8a6e053c6.jpg 我正在参加「码上掘金迎新年」编程比赛,详情请看:码上掘金迎新年

实现代码在文末码上掘金区域

前言

不知道你是否为写CRUD代码所烦恼?

在12月底,距离我学习Golang过了差不多3个月,为了巩固现有的学习成果,也为了更好的管理我的内容,我萌发了写一个博客程序的想法。但在开发的过程中,我遇到了很多重复且繁琐的任务,其中CRUD代码是我很头疼的问题,我不得不在数据库中每个表都写一遍这些代码,也是我的博客项目进度缓慢的原因之一。

在期末考试之后,我有了足够的时间进行Coding,恰巧看到了「码上掘金迎新年」这个活动,于是萌生了写一个自动代码生成器的想法。

为了更好地表达我的想法,接下来的部分我将会以一问一答的形式展开,读者可以选择自己感兴趣的部分进行阅读。

正文

Q:为什么会使用Go语言进行开发?

A:1.我学习Go语言不久,使用Go语言进行编程以便让我更熟悉这门语言
2.Go语言的官方标准库非常丰富,我一直想试试,趁着这次机会我上手体验了一番,确实很方便
3.Go 语言在性能、并发支持、简洁的语法和易用的工具链方面都有着出色的表现,因此我认为它是写这个代码生成器的最佳选择

Q:你是如何设计和开发这个代码生成器的?用到了哪些技术和方法?

A: 这是我的开发思路:

graph LR
A[开始] --> B[需求分析]
B --> C[设计]
C --> D[实现]
D --> E[测试]
E --> F[编译]
F --> G[结束]

首先来说,因为这个项目诞生于我的日常编程中,所以我的目标比较明确,这个代码生成器首先需要能生成我们常用的业务代码,比如:

  • 数据库访问代码:生成各种数据库访问代码,帮助使用者快速完成数据库操作。
  • Web 服务代码:生成各种 Web 服务代码,帮助使用者快速构建基于 HTTP 协议的 API。
  • 其他常见业务代码:生成其他常见业务代码,如邮件发送代码

其次,因为编程中会遇到多语言编程的需求,所以这个代码生成器应该支持多语言。具体来说,是能够支持多语言版本代码的生成,而不局限于Go。

最后,为了后期更好的维护,这个代码生成器在代码风格和代码代码结构上应该保持一致。

基于以上的需求,我选择了模板生成代码的思路。由于代码使用模板生成,开发者可以很方便的控制代码风格和代码结构,并且能让社区更多的参与到这个项目来,贡献自己的模板。具体而言,我使用了golang的text/template包(链接)。text/template在 golang 中是一个很有用的包,它可以帮助生成各种类型的文本输出,比如 HTML、XML、JSON 等。

在这个项目中,我建立了一个文件夹()用于存放模板。然后,我使用 golang 的 template 包来解析模板字符串并生成模板对象。最后,我使用了模板对象的 Execute 方法来将模板渲染为最终的输出字符串。

项目目录结构如下: (具体代码在文末的码上掘金区域)

目录结构
├─json
├───default.json
├─model
├───model.go
├─templates
├───template.tmpl
├─utils
├───flags.go
├───template.go
└─main.go

实现的示例代码如下:

package main

import (
    "os"
    "text/template"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    // 定义模板字符串
    const tpl = `{{.Name}}是{{.Age}}岁。`
    // 解析模板字符串
    t, err := template.New("person").Parse(tpl)
    if err != nil {
        panic(err)
    }
    // 创建 Person 结构体
    p := Person{Name: "千石", Age: 19}
    // 使用 Person 结构体渲染模板
    err = t.Execute(os.Stdout, p)
    if err != nil {
        panic(err)
    }
}

输出如下

千石是19岁

Q:你是如何设计输入和输出的?

A:在设计代码生成器的输入输出时,需要考虑如何让使用者能够输入有关代码生成的信息,并输出生成的代码。为了方便与其他程序进行交互,我使用了 JSON 格式作为输入格式。用户可以使用 JSON 格式输入要生成的代码类型、文件名、包名等信息。

对于输出,程序会在接受输入后生成一个 Go 源文件,并将其保存到指定的路径。

在未来,我计划使用抽象语法树(AST)来改进CodeGen。AST 可以帮助生成代码更好地控制语法,并且可以让CodeGen支持更多的代码生成选项。我也计划提供一个可视化界面,让用户更方便地输入信息和观察生成的代码。

Q:对于GoCodeGen有什么未来规划吗?

有的,具体如下:

  1. 继续完善 CodeGen,使用 AST 帮助控制代码的语法,并且支持更多的代码生成选项,并优化生成的代码的质量
  2. 提供一个可视化界面可以让用户更方便地输入信息和观察生成的代码
  3. 为了提高工具的可用性,支持多种输入输出格式。例如,YAML 或 XML 等其他格式。
  4. 设计服务端API,让程序能有更多可能(比如包装成服务端API)
  5. 继续编写测试用例,以确保 CodeGen 的正确性和可靠性

总结

GoCodeGen 是一款使用 Go 语言开发的代码生成器。它能够帮助程序员更快地完成开发任务,并且可以大大提高生产力。在开发 CodeGen 时,我遇到了一些问题。例如:由于知道比赛的时间较晚,所以我的开发时间较短,没有将 CodeGen 开发得像原本计划的那样完善。此外,我还遇到了一些其他困难,例如遇到BUG时代码调试困难。在未来,我计划继续完善 GoCodeGen,支持更多的功能,并与社区合作,以帮助更多的人使用 GoCodeGen。

码上掘金

如果你觉得我的点子不错,或者你认为我的作品写的很不错,可以为我的作品点个赞嘛,你的支持是我最大的动力!