为什么要写这个

主要还是为了加深自己的理解。第一次接触代码生成的东西,这玩意原来也可以分为各种流派的。比如,用 template 来生成整个代码文件。比如用 stringer 来生成一些辅助方法啥的。注意这个 stringer 不是 https://pkg.go.dev/fmt#Stringer, 而是 https://pkg.go.dev/golang.org/x/tools/cmd/stringer。不得不说,咱们国内的文章啊,你得弄清楚啊,第一个 stringer 是个接口啊,你让接口来生成代码么。

先说说 stringer

为啥要拿这个举例,因为有很多的文章都是这个,所以我们也用这个来弄。

Stringer is a tool to automate the creation of methods that satisfy the fmt.Stringer interface. Given the name of a (signed or unsigned) integer type T that has constants defined, stringer will create a new self-contained Go source file implementing

这个是 https://pkg.go.dev/golang.org/x/tools/cmd/stringer 里面的说明。看起来很麻烦,简单点说就是生成了一个 string 方法。

按照文档说法,这个是适合生成用 const iota 生命的,比如错误代码什么的。

看下面之前最好先看看 https://xie.infoq.cn/article/e7a2d044bafbf474706e441cc 比我写的细致的多。

我们直接上个代码吧,根据官方例子来的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

//go:generate stringer -type=Pill
type Pill int

const (
	Placebo Pill = iota // pla
	Aspirin // asp
	Ibuprofen // ibup
	Paracetamol // pa
	Acetaminophen = Paracetamol
)

func main() {
	fmt.Println(Placebo)
}

我们在运行之前,别忘记执行 go generate 命令。然后 run 可以看到输出了字符串。

下面上个实际的列子 http 错误代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import "fmt"

//go:generate stringer -type=HttpErrorCode -linecomment
type HttpErrorCode int

const (
	HTTP_OK HttpErrorCode = 200 // 访问成功
	HTTP_NOT_FOUNT HttpErrorCode = 404 // 404 不存在
	HTTP_SERVICE_UNAVAILABLE HttpErrorCode = 503 // 503 服务端错误
)

func main() {
	fmt.Println(HTTP_OK)
	fmt.Println(HTTP_OK == 201)
}

通过这个就可以看出来,我们只要写好说明,剩下的就全靠生成就好了,从此节省生命 1s。

再说说 template

用 template 一般都是用来生成代码文件,比如数据库生成 model,根据model 生成基础 curd 代码,不过这段,暂时先不弄示例,我还得在学习学习,然后等以后再 实例 的时候在加上来就好了

写在正文之后

距离上次写东西已经过去4个月了,最近几个月不知道自己都在干什么,东西看了不少,输出也不少,但要说有什么可写的,那几乎就是 0 了。今天终于弄出来一个了。接下来 grpc k8s 乱七八糟的都弄起来了。