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

240 天前
 zhwguest

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

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

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

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

1251 次点击
所在节点    Go 编程语言
10 条回复
aapeli
240 天前
tairan2006
240 天前
最简单的办法是用 protobuf 生成
lasuar
240 天前
自己写个代码生成器,又不难
zhwguest
240 天前
@aapeli 感谢哈,我是说如果我有一堆,如何降低重复代码,这个提供 int <-> string 之间映射的函数肯定是要定制的。我的意思是从这个关系上扩展的一堆函数能不能不用每种 enum 都要写一份。
bazingaterry
240 天前
走 code gen 吧
raies
240 天前
@aapeli 牛逼, 直接手打代码
timnottom
240 天前
自己多写几个 code gen , 能极大提高开发效率
aapeli
240 天前
看起来如 #7 #3 讲的,code generate 吧, 读 ast 去 generate code
aapeli
240 天前
fenglangjuxu
239 天前
```

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