Golang中int和string枚举类型的基本用法

2,535 阅读1分钟

虽然枚举的使用方法很多,但我只特别展示两种。一种是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)
}