前言:
我在中发布了此实用程序
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 January12 December0 %!Month(0)
请注意,此映射具有灵活性,您可以添加短月份名称,以映射到同一月份。例如,您也可以添加
months["Jan"] =time.January,因此,如果您的输入是
"Jan",您也可以获取
time.January。可以通过在同一循环中对长名称进行切片来轻松完成此操作,例如:
for i := time.January; i <= time.December; i++ { name := i.String() months[name] = i months[name[:3]] = i}另请注意,可以
time.Parse()在布局字符串为的地方进行解析
"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"
但是,简单的地图查找在性能上胜于此。



