请教 golang 大神如何实现一些 parsable/printable 的 enum 类型

2023-09-13 12:27:57 +08:00
 zhwguest

程序中一大堆 enum 类型,这些 enum 类型会参与 Json 的编解码、日志打印等等。

想到最起码的方式,必须为这个 enum 类型提供一堆在值和 string 的映射关系,比如使用[]string 或者 map[int]string 。这个肯定是每个 enum 少不了的代码。假设就是 String()吧。

但是对于 Unmarshal 、String 、Marshal 、Sacn 等接口,每个类型都得写一个么?在面向对象里面,只要基类实现了这几个接口,其他的 enum 都基于这个基类来实现就好了。

Golang 中如何避免大量的代码拷贝粘贴呢?

1441 次点击
所在节点    Go 编程语言
10 条回复
aapeli
2023-09-13 12:36:01 +08:00
tairan2006
2023-09-13 12:36:55 +08:00
最简单的办法是用 protobuf 生成
lasuar
2023-09-13 12:44:49 +08:00
自己写个代码生成器,又不难
zhwguest
2023-09-13 14:37:45 +08:00
@aapeli 感谢哈,我是说如果我有一堆,如何降低重复代码,这个提供 int <-> string 之间映射的函数肯定是要定制的。我的意思是从这个关系上扩展的一堆函数能不能不用每种 enum 都要写一份。
bazingaterry
2023-09-13 14:54:13 +08:00
走 code gen 吧
raies
2023-09-13 15:58:36 +08:00
@aapeli 牛逼, 直接手打代码
timnottom
2023-09-13 15:59:33 +08:00
自己多写几个 code gen , 能极大提高开发效率
aapeli
2023-09-13 16:24:13 +08:00
看起来如 #7 #3 讲的,code generate 吧, 读 ast 去 generate code
aapeli
2023-09-13 16:27:34 +08:00
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 都写上,然后做些处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/973349

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX