Предисловие: Я выпустил эту утилиту в 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
. Это можно легко сделать, нарезав длинное имя в том же l oop, например:
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"
Но простой Поиск по карте превосходит это по производительности.
См. аналогичный вопрос: Анализ строки дня недели по времени. Выходной