Golang ile enum tiplerinin kullanımının birçok yolu olmasına rağmen, özellikle iki model göstereceğim. Biri int, diğeri string kullanımı için. Golang'da enumlar değişken türü olarak tanımlandırıldıklarında, bunları ayrıca aşağıda gösterildiği gibi fonksiyonların bağımsız değişkenleri olarak da kullanabilirsiniz.


Image


Bu, enum tipleriyle çalışan asıl öğemizdir.


package image

type Image struct {
extension Extension
state State
}

func (i *Image) State() State {
return i.state
}

func (i *Image) ChangeState(state State) {
// You can actually verify if state is valid first.
i.state = state
}

func (i *Image) Extension() Extension {
return i.extension
}

func (i *Image) ChangeExtension(extension Extension) {
// You can actually verify if extension is valid first.
i.extension = extension
}

Enumlar


State (int)


package image

type State int

const (
Uploaded State = iota
Resized
Saved
)

func (s State) String() string {
states := [...]string{"Uploaded", "Resized", "Saved"}
if len(states) < int(s) {
return ""
}

return states[s]
}

Bu şekilde kullanabilirsiniz.


package main

import (
"fmt"

"internal/image"
)

func main() {
fmt.Println("- STATE -")
var sta image.State
fmt.Println(sta) // Uploaded = 0 (default when not set)
fmt.Println(sta.String()) // Uploaded = 0 (default when not set)
sta = 1
fmt.Println(sta.String()) // Resized = 1
sta = image.Saved
fmt.Println(sta.String()) // Saved = 2

fmt.Println("- IMAGE -")
img := &image.Image{}
fmt.Println(img.State().String()) // Uploaded = 0 (default when not set)
img.ChangeState(image.Saved)
fmt.Println(img.State().String()) // Saved = 2
img.ChangeState(0)
fmt.Println(img.State().String()) // Uploaded = 0
img.ChangeState(5)
fmt.Println(img.State().String()) // Empty (default when index out of range)
}

Extension (string)


package image

type Extension string

const (
JPG Extension = "JPG"
PNG = "PNG"
GIF = "GIF"
BMP = "BMP"
)

func (e Extension) String() string {
extensions := [...]string{"JPG", "PNG", "GIF", "BMP"}

x := string(e)
for _, v := range extensions {
if v == x {
return x
}
}

return ""
}

Bu şekilde kullanabilirsiniz.


package main

import (
"fmt"

"internal/image"
)

func main() {
fmt.Println("- EXTENSION -")
var ext image.Extension
fmt.Println(ext.String()) // Empty (default when not set)
ext = "PNG"
fmt.Println(ext.String()) // PNG
ext = image.GIF
fmt.Println(ext.String()) // GIF

fmt.Println("- IMAGE -")
img := &image.Image{}
fmt.Println(img.Extension().String()) // Empty (default when not set)
img.ChangeExtension(image.BMP)
fmt.Println(img.Extension().String()) // BMP
img.ChangeExtension("PNG")
fmt.Println(img.Extension().String()) // PNG
img.ChangeExtension("ABC")
fmt.Println(img.Extension().String()) // Empty (default for invalid value)
}