Although there are many ways of enum usage, I'll just show two in particular. One for int and another for string usage. When using enums as variable type in Golang, you can use these as function arguments as shown below.


Image


This is our actual type that depends on enum types.


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
}

Enums


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]
}

This is how you can use it.


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 ""
}

This is how you can use it.


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)
}