我试图代表一个简化的染色体,它由N个碱基组成,每个碱基只能是{A, C, T, G}
中的一个。
我想用枚举来形式化约束,但我想知道在Go中模拟枚举最常用的方式是什么。
发布于 2017-11-21 19:05:08
你可以这样做:
type MessageType int32
const (
TEXT MessageType = 0
BINARY MessageType = 1
)
使用此代码,编译器应检查枚举类型
发布于 2018-03-20 06:48:17
确实,上面使用const
和iota
的例子是在Go中表示原生枚举的最常用的方式。但是,如果您正在寻找一种方法来创建一个功能更全的枚举,它与您在另一种语言(如Java或Python )中看到的类型相似,该怎么办呢?
创建一个在Python中开始看起来和感觉上像字符串枚举的对象的一种非常简单的方法是:
package main
import (
"fmt"
)
var Colors = newColorRegistry()
func newColorRegistry() *colorRegistry {
return &colorRegistry{
Red: "red",
Green: "green",
Blue: "blue",
}
}
type colorRegistry struct {
Red string
Green string
Blue string
}
func main() {
fmt.Println(Colors.Red)
}
假设您还需要一些实用程序方法,如Colors.List()
和Colors.Parse("red")
。而且你的颜色更复杂,需要一个结构体。然后你可能会做一些类似这样的事情:
package main
import (
"errors"
"fmt"
)
var Colors = newColorRegistry()
type Color struct {
StringRepresentation string
Hex string
}
func (c *Color) String() string {
return c.StringRepresentation
}
func newColorRegistry() *colorRegistry {
red := &Color{"red", "F00"}
green := &Color{"green", "0F0"}
blue := &Color{"blue", "00F"}
return &colorRegistry{
Red: red,
Green: green,
Blue: blue,
colors: []*Color{red, green, blue},
}
}
type colorRegistry struct {
Red *Color
Green *Color
Blue *Color
colors []*Color
}
func (c *colorRegistry) List() []*Color {
return c.colors
}
func (c *colorRegistry) Parse(s string) (*Color, error) {
for _, color := range c.List() {
if color.String() == s {
return color, nil
}
}
return nil, errors.New("couldn't find it")
}
func main() {
fmt.Printf("%s\n", Colors.List())
}
在这一点上,它当然可以工作,但您可能不喜欢重复定义颜色的方式。如果在这一点上你想要消除它,你可以在你的struct上使用标签,并做一些奇特的反射来设置它,但希望这足以覆盖大多数人。
发布于 2020-09-28 04:31:16
有一种方法可以使用struct命名空间。
好处是所有枚举变量都在一个特定的名称空间下,以避免污染。问题是我们只能使用var
而不能使用const
type OrderStatusType string
var OrderStatus = struct {
APPROVED OrderStatusType
APPROVAL_PENDING OrderStatusType
REJECTED OrderStatusType
REVISION_PENDING OrderStatusType
}{
APPROVED: "approved",
APPROVAL_PENDING: "approval pending",
REJECTED: "rejected",
REVISION_PENDING: "revision pending",
}
https://stackoverflow.com/questions/14426366
复制相似问题