1 回答

TA貢獻(xiàn)1847條經(jīng)驗 獲得超11個贊
前言:我在 中發(fā)布了這個實用程序github.com/icza/gox,請參閱timex.ParseMonth()。
這是目前最好的方法。
最好的辦法是使用包級變量并只填充一次地圖。
以這種方式處理人口更清潔、更安全:
var months = map[string]time.Month{}
func init() {
for i := time.January; i <= time.December; i++ {
months[i.String()] = i
}
}
測試它:
for _, s := range []string{"January", "December", "invalid"} {
m := months[s]
fmt.Println(int(m), m)
}
輸出(在Go Playground上試試):
1 January
12 December
0 %!Month(0)
請注意,此地圖具有靈活性,您可以添加短月份名稱,映射到同一月份。例如,您也可以添加months["Jan"] = time.January,所以如果您的輸入是"Jan",您也可以得到time.January。這可以通過在同一個循環(huán)中分割長名稱來輕松完成,例如:
for i := time.January; i <= time.December; i++ {
name := i.String()
months[name] = i
months[name[:3]] = i
}
另請注意,可以使用time.Parse()在布局字符串所在的位置進(jìn)行解析"January":
for _, s := range []string{"January", "December", "invalid"} {
t, err := time.Parse("January", s)
m := t.Month()
fmt.Println(int(m), m, err)
}
哪些輸出(在Go Playground上嘗試):
1 January <nil>
12 December <nil>
1 January parsing time "invalid" as "January": cannot parse "invalid" as "January"
但是簡單的地圖查找在性能上要優(yōu)于這個。
- 1 回答
- 0 關(guān)注
- 231 瀏覽
添加回答
舉報