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