15/04/2020 - GO
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.
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
}
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)
}
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)
}