Golang Go语言中请教大神如何实现一些parsable/printable的enum类型
程序中一大堆 enum 类型,这些 enum 类型会参与 Json 的编解码、日志打印等等。
想到最起码的方式,必须为这个 enum 类型提供一堆在值和 string 的映射关系,比如使用[]string 或者 map[int]string 。这个肯定是每个 enum 少不了的代码。假设就是 String()吧。
但是对于 Unmarshal 、String 、Marshal 、Sacn 等接口,每个类型都得写一个么?在面向对象里面,只要基类实现了这几个接口,其他的 enum 都基于这个基类来实现就好了。
Golang 中如何避免大量的代码拷贝粘贴呢?
Golang Go语言中请教大神如何实现一些parsable/printable的enum类型
更多关于Golang Go语言中请教大神如何实现一些parsable/printable的enum类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang Go语言中请教大神如何实现一些parsable/printable的enum类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
最简单的办法是用 protobuf 生成
自己写个代码生成器,又不难
感谢哈,我是说如果我有一堆,如何降低重复代码,这个提供 int <-> string 之间映射的函数肯定是要定制的。我的意思是从这个关系上扩展的一堆函数能不能不用每种 enum 都要写一份。
走 code gen 吧
牛逼, 直接手打代码
自己多写几个 code gen , 能极大提高开发效率
看起来如 #7 #3 讲的,code generate 吧, 读 ast 去 generate code
<br><br>for key, value := range inputData {<br> switch value.(type) {<br> case string:<br> outputData[key] = value.(string)<br> case int:<br> tmp := value.(int)<br> outputData[key] = Int2Str(tmp)<br> case int64:<br> tmp := value.(int64)<br> outputData[key] = Int642Str(tmp)<br> }<br> }<br><br>
类似这样,写一个函数 在 case 里面吧所有的 enum 都写上,然后做些处理
在Go语言中,虽然没有内置的枚举(enum)类型,但我们可以通过一些技巧来实现可解析(parsable)和可打印(printable)的枚举类型。这里有一个常见的实现方法:
-
定义枚举类型: 使用
iota
枚举常量,并定义一个映射来关联枚举值和字符串表示。package main import ( "fmt" "strconv" ) type Status int const ( Unknown Status = iota Active Inactive ) var statusName = map[Status]string{ Unknown: "Unknown", Active: "Active", Inactive: "Inactive", } func (s Status) String() string { return statusName[s] } func ParseStatus(s string) (Status, error) { for k, v := range statusName { if v == s { return k, nil } } return Unknown, fmt.Errorf("invalid status: %s", s) } func main() { status := Active fmt.Println("Status:", status.String()) parsedStatus, err := ParseStatus("Inactive") if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Parsed Status:", parsedStatus.String()) } }
这段代码展示了如何定义枚举类型Status
,并实现其字符串表示和解析功能。String
方法用于将枚举值转换为字符串,而ParseStatus
函数则用于将字符串解析为枚举值。