यह सच है कि उपरोक्त उदाहरणों का उपयोग करना const
औरiota
गो में आदिम एनमों का प्रतिनिधित्व करने का सबसे मुहावरेदार तरीका है। लेकिन क्या होगा यदि आप जावा या पायथन जैसी किसी अन्य भाषा में देखे गए प्रकार के समान अधिक पूर्ण रूप से चित्रित किए गए एनम बनाने का मार्ग खोज रहे हैं?
एक बहुत ही सरल तरीके से एक ऐसी वस्तु तैयार की जाती है जो पायथन में स्ट्रिंग एनम की तरह दिखना और महसूस करना शुरू करती है:
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())
}
उस बिंदु पर, सुनिश्चित करें कि यह काम करता है, लेकिन आपको यह पसंद नहीं है कि आपको रंगों को कैसे दोहराना है। यदि इस बिंदु पर आप इसे समाप्त करना चाहते हैं, तो आप अपनी संरचना पर टैग का उपयोग कर सकते हैं और इसे स्थापित करने के लिए कुछ फैंसी प्रतिबिंबित कर सकते हैं, लेकिन उम्मीद है कि यह अधिकांश लोगों को कवर करने के लिए पर्याप्त है।