Memang benar bahwa contoh-contoh penggunaan di atas const
dan iota
merupakan cara paling idiomatis untuk mewakili enum primitif di Go. Tetapi bagaimana jika Anda sedang mencari cara untuk membuat enum yang lebih berfitur lengkap mirip dengan jenis yang akan Anda lihat dalam bahasa lain seperti Java atau Python?
Cara yang sangat sederhana untuk membuat objek yang mulai terlihat dan terasa seperti string enum dengan Python adalah:
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)
}
Misalkan Anda juga menginginkan beberapa metode utilitas, seperti Colors.List()
, dan Colors.Parse("red")
. Dan warna Anda lebih kompleks dan perlu menjadi struct. Maka Anda mungkin melakukan sesuatu yang sedikit seperti ini:
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())
}
Pada titik itu, pasti berhasil, tetapi Anda mungkin tidak suka bagaimana Anda harus mendefinisikan warna secara berulang. Jika pada titik ini Anda ingin menghilangkan itu, Anda dapat menggunakan tag pada struct Anda dan melakukan beberapa perenungan untuk mengaturnya, tetapi mudah-mudahan ini cukup untuk menutupi sebagian besar orang.