虽然枚举的使用方法很多,但我只特别展示两种。一种是int,另一种是字符串的用法。当在Golang中使用枚举作为变量类型时,你可以把它们作为函数参数使用,如下图所示。
图片
这是我们的实际类型,依赖于枚举类型。
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
}
枚举
状态 (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]
}
这是你可以使用的方式:
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)
}
扩展 (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 ""
}
这是你可以使用它的方式:
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)
}