V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
woostundy
V2EX  ›  Go 编程语言

Go 中怎么实现类似 Java 里的枚举类型?

  •  
  •   woostundy · 2020-09-04 10:32:11 +08:00 · 3789 次点击
    这是一个创建于 1329 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用定义常量来实现枚举类型,太简易了。没法通过值找到枚举名称,没法约束值范围,没法输出所有可选枚举值。 试过在自定义类型上面加 String(), All() 方法,但代码又多又丑陋。 有什么好的写法或者第三方包能实现吗?

    20 条回复    2020-09-05 07:36:40 +08:00
    scnace
        1
    scnace  
       2020-09-04 10:51:00 +08:00 via Android
    code generation (逃
    lbp0200
        2
    lbp0200  
       2020-09-04 10:54:50 +08:00   ❤️ 1
    直接复制粘贴了

    type Direction int

    const (
    North Direction = iota
    East
    South
    West
    )

    func (d Direction) String() string {
    return [...]string{"North", "East", "South", "West"}[d]
    }
    virusdefender
        3
    virusdefender  
       2020-09-04 11:05:13 +08:00   ❤️ 1
    https://github.com/abice/go-enum 这种库,来帮你生成代码
    tairan2006
        4
    tairan2006  
       2020-09-04 11:11:02 +08:00
    是的,用代码生成器…
    woostundy
        5
    woostundy  
    OP
       2020-09-04 11:56:59 +08:00
    啊这。。感觉太丑了吧。
    我一直认为能用代码生成器生成的代码都是没抽象好的代码。
    Go 对此有改进计划吗?
    @tairan2006 #4
    @scnace #1
    smallthing
        6
    smallthing  
       2020-09-04 12:13:01 +08:00
    没觉得丑
    no1xsyzy
        7
    no1xsyzy  
       2020-09-04 12:34:01 +08:00
    @woostundy “宏” 其实就是代码生成器啊(
    lisper 吹宏的时候就是吹抽象能力啊(
    GM
        8
    GM  
       2020-09-04 13:11:52 +08:00
    @woostundy
    我们 Go 讲究的是大道至简,不需要复杂东西。

    什么?你说你需要?我不要你需要,我要我需要才是需要。
    tikazyq
        9
    tikazyq  
       2020-09-04 13:45:19 +08:00
    const
    reus
        10
    reus  
       2020-09-04 14:03:07 +08:00   ❤️ 1
    @GM 明明就是已经有工具解决了问题,而且肯定是有人需要才出现了相关工具,你这种人非要视而不见,非要在那里自己竖起靶子自己打。都不知道怎么 go 就招惹到你们这群反智东西,技术讨论不会,上来就一句“大道至简”,恶心至极。
    gowk
        11
    gowk  
       2020-09-04 14:33:35 +08:00
    楼上大佬消消气,没必要,视而不见就得了。话说“大道至简”用英语怎么说来着?应该是 less is more 吧,懂的人自然懂。

    “There are only two kinds of languages: the ones people complain about and the ones nobody uses.”
    reus
        12
    reus  
       2020-09-04 15:26:36 +08:00
    @gowk 不能视而不见,而是应该让这些人滚开。现在所有提“大道至简”的,都是毫无营养跟风黑的傻逼。垃圾不清理,就会到处乱跑,搞坏整个环境。所以看见垃圾,就应该清理,维护良好环境。
    araraloren
        13
    araraloren  
       2020-09-04 16:37:43 +08:00
    @reus 然而,你说的工具也只是权宜之计,go 自身要是能很好的解决这个问题,谁还会去生成代码。。
    reus
        14
    reus  
       2020-09-04 16:47:45 +08:00
    @araraloren 你来告诉我,哪个静态语言可以通过值获得名称,而又不需要额外的代码或者宏的?哪个静态语言可以从语法层面约束值范围的?哪个语言提供了获得所有可选枚举值的语法的?
    kkkkkrua
        15
    kkkkkrua  
       2020-09-04 16:54:42 +08:00
    #8 不是反串黑吗
    Itoktsnhc
        16
    Itoktsnhc  
       2020-09-04 16:56:02 +08:00
    其他语言反射可以嘛
    NoUltimate
        17
    NoUltimate  
       2020-09-04 17:14:39 +08:00
    proto 有 enum,不过也是代码生成
    cassyfar
        18
    cassyfar  
       2020-09-04 17:26:27 +08:00
    我觉得 Go 写 protobuf 的 service 比较方便。所有 class 都在 protobuf 里定义,然后自动生成。protobuf 支持 enum 和各种限制。

    我写 Go 大概一年了,以前写了 4 年 Java 。个人还是更喜欢 Java,一直不是很 get 得到 Go 的好处。主要槽点是缺乏完整 OOD 。我个人理解是 Go 是为了出活快产生的,你不必要深耕,依然写出能用的代码。但我看 Go,和看屎山差不多。
    nannanziyu
        19
    nannanziyu  
       2020-09-04 20:24:42 +08:00
    @reus

    有反射的都行
    lrh3321
        20
    lrh3321  
       2020-09-05 07:36:40 +08:00 via Android
    元编程 (狗头
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1461 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 23:54 · PVG 07:54 · LAX 16:54 · JFK 19:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.