2 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
沒有直接的方法可以在運(yùn)行時(shí)枚舉命名類型的值/實(shí)例,無論是變量還是常量,除非您專門定義了一個(gè)列出它們的切片。這由枚舉類型的定義者或用戶決定。
package main
import (
"fmt"
"time"
)
var Weekdays = []time.Weekday{
time.Sunday,
time.Monday,
time.Tuesday,
time.Wednesday,
time.Thursday,
time.Friday,
time.Saturday,
}
func main() {
for _, day := range Weekdays {
fmt.Println(day)
}
}
為了能夠在運(yùn)行時(shí)動(dòng)態(tài)生成此列表,例如通過反射,鏈接器必須保留所有包中定義的所有符號,就像 Java 所做的那樣。golang-nuts 小組討論了這個(gè),關(guān)于從包導(dǎo)出的名稱和函數(shù),包常量定義的超集。https://groups.google.com/forum/#!topic/golang-nuts/M0ORoEU115o
當(dāng)且僅當(dāng)程序引用它時(shí),語言才有可能包含用于在編譯時(shí)生成此列表的語法糖。但是,迭代順序應(yīng)該是什么?如果您的一周從星期一開始,那么我定義的列表不是很有幫助;您必須定義自己的切片,以涵蓋從星期一到星期日的天數(shù)。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
你可以在沒有反思的情況下做到這一點(diǎn)。
首先Stringer在編譯時(shí)使用go generate. 這將創(chuàng)建一個(gè)文件[filename]_string.go,其中包含將_[structname]_map枚舉變量名稱作為字符串引用的枚舉值映射。此映射是私有的,因此只需在包初始化時(shí)將其分配給公共映射即可。
var EnumMap map[Enum]string
func init() {
EnumMap = _Enum_map
}
type Enum uint
//go:generate go run golang.org/x/tools/cmd/stringer -type=Enum
const (
One Enum = iota
Two
)
然后你可以簡單地遍歷地圖的鍵。
- 2 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)