Golang Go语言中怎么实现类似Java里的枚举类型?
Golang Go语言中怎么实现类似Java里的枚举类型?
用定义常量来实现枚举类型,太简易了。没法通过值找到枚举名称,没法约束值范围,没法输出所有可选枚举值。
试过在自定义类型上面加 String()
, All()
方法,但代码又多又丑陋。
有什么好的写法或者第三方包能实现吗?
直接复制粘贴了
type Direction int
const (
North Direction = iota
East
South
West
)
func (d Direction) String() string {
return […]string{“North”, “East”, “South”, “West”}[d]
}
https://github.com/abice/go-enum 这种库,来帮你生成代码
是的,用代码生成器…
啊这。。感觉太丑了吧。
我一直认为能用代码生成器生成的代码都是没抽象好的代码。
Go 对此有改进计划吗?
#4
#1
“宏” 其实就是代码生成器啊(
lisper 吹宏的时候就是吹抽象能力啊(
我们 Go 讲究的是大道至简,不需要复杂东西。
什么?你说你需要?我不要你需要,我要我需要才是需要。
const
明明就是已经有工具解决了问题,而且肯定是有人需要才出现了相关工具,你这种人非要视而不见,非要在那里自己竖起靶子自己打。都不知道怎么 go 就招惹到你们这群反智东西,技术讨论不会,上来就一句“大道至简”,恶心至极。
楼上大佬消消气,没必要,视而不见就得了。话说“大道至简”用英语怎么说来着?应该是 less is more 吧,懂的人自然懂。
“There are only two kinds of languages: the ones people complain about and the ones nobody uses.”
然而,你说的工具也只是权宜之计,go 自身要是能很好的解决这个问题,谁还会去生成代码。。
你来告诉我,哪个静态语言可以通过值获得名称,而又不需要额外的代码或者宏的?哪个静态语言可以从语法层面约束值范围的?哪个语言提供了获得所有可选枚举值的语法的?
#8 不是反串黑吗
其他语言反射可以嘛
proto 有 enum,不过也是代码生成
我觉得 Go 写 protobuf 的 service 比较方便。所有 class 都在 protobuf 里定义,然后自动生成。protobuf 支持 enum 和各种限制。
我写 Go 大概一年了,以前写了 4 年 Java 。个人还是更喜欢 Java,一直不是很 get 得到 Go 的好处。主要槽点是缺乏完整 OOD 。我个人理解是 Go 是为了出活快产生的,你不必要深耕,依然写出能用的代码。但我看 Go,和看屎山差不多。
元编程 (狗头
在Go语言中,虽然没有像Java那样的原生枚举类型,但我们可以通过几种方式来实现类似的功能。
一种常见的方法是使用iota
枚举。iota
是Go语言的一个预定义常量生成器,用于生成从0开始的连续整数常量。通过这种方式,可以定义一组相关常量,并赋予它们唯一的整数值。例如:
package main
import "fmt"
type Color int
const (
Red Color = iota
Green
Blue
)
func main() {
var c Color = Green
fmt.Println(c) // 输出: 1
switch c {
case Red:
fmt.Println("Red")
case Green:
fmt.Println("Green")
case Blue:
fmt.Println("Blue")
}
}
此外,还可以利用结构体和字符串来表示枚举值,以提高可读性和灵活性。例如:
package main
import "fmt"
type Color struct {
name string
}
var (
Red = Color{"Red"}
Green = Color{"Green"}
Blue = Color{"Blue"}
)
func main() {
var c Color = Green
fmt.Println(c.name) // 输出: Green
}
这两种方法各有优缺点,第一种方法更简洁且性能较好,适合对性能要求高的场景;第二种方法可读性更强,适合需要频繁打印或调试的场景。选择哪种方法取决于具体需求。