Golang Go语言中请教大神如何实现一些parsable/printable的enum类型

发布于 1周前 作者 ionicwang 来自 Go语言

程序中一大堆 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

11 回复

更多关于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)的枚举类型。这里有一个常见的实现方法:

  1. 定义枚举类型: 使用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函数则用于将字符串解析为枚举值。

回到顶部