程序中一大堆 enum 类型,这些 enum 类型会参与 Json 的编解码、日志打印等等。
想到最起码的方式,必须为这个 enum 类型提供一堆在值和 string 的映射关系,比如使用[]string 或者 map[int]string 。这个肯定是每个 enum 少不了的代码。假设就是 String()吧。
但是对于 Unmarshal 、String 、Marshal 、Sacn 等接口,每个类型都得写一个么?在面向对象里面,只要基类实现了这几个接口,其他的 enum 都基于这个基类来实现就好了。
Golang 中如何避免大量的代码拷贝粘贴呢?
1
aapeli 2023-09-13 12:36:01 +08:00 1
|
2
tairan2006 2023-09-13 12:36:55 +08:00 via Android
最简单的办法是用 protobuf 生成
|
3
lasuar 2023-09-13 12:44:49 +08:00 1
自己写个代码生成器,又不难
|
4
zhwguest OP @aapeli 感谢哈,我是说如果我有一堆,如何降低重复代码,这个提供 int <-> string 之间映射的函数肯定是要定制的。我的意思是从这个关系上扩展的一堆函数能不能不用每种 enum 都要写一份。
|
5
bazingaterry 2023-09-13 14:54:13 +08:00
走 code gen 吧
|
7
timnottom 2023-09-13 15:59:33 +08:00
自己多写几个 code gen , 能极大提高开发效率
|
8
aapeli 2023-09-13 16:24:13 +08:00
看起来如 #7 #3 讲的,code generate 吧, 读 ast 去 generate code
|
9
aapeli 2023-09-13 16:27:34 +08:00
|
10
fenglangjuxu 2023-09-14 09:58:19 +08:00
```
for key, value := range inputData { switch value.(type) { case string: outputData[key] = value.(string) case int: tmp := value.(int) outputData[key] = Int2Str(tmp) case int64: tmp := value.(int64) outputData[key] = Int642Str(tmp) } } ``` 类似这样,写一个函数 在 case 里面吧所有的 enum 都写上,然后做些处理 |