Разобрать строку дня недели во время. - PullRequest
0 голосов
/ 22 сентября 2018

Я столкнулся с проблемой преобразования строки дня недели в значение time.Weekday.Я не смог найти ничего встроенного в пакет time.

Тогда я написал эту простую функцию (которая покрывает мои потребности):

var daysOfWeek = [...]string{
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
}

func parseWeekday(v string) (time.Weekday, error) {
    for i := range daysOfWeek {
        if daysOfWeek[i] == v {
            return time.Weekday(i), nil
        }
    }

    return time.Sunday, fmt.Errorf("invalid weekday '%s'", v)
}

Есть ли другие рекомендуется или более идиоматический способ выполнить это преобразование в Голанге?

Спасибо!

1 Ответ

0 голосов
/ 22 сентября 2018

Да, используйте карту вместо массива, чтобы поиск выполнялся быстрее и проще:

var daysOfWeek = map[string]time.Weekday{
    "Sunday":    time.Sunday,
    "Monday":    time.Monday,
    "Tuesday":   time.Tuesday,
    "Wednesday": time.Wednesday,
    "Thursday":  time.Thursday,
    "Friday":    time.Friday,
    "Saturday":  time.Saturday,
}

func parseWeekday(v string) (time.Weekday, error) {
    if d, ok := daysOfWeek[v]; ok {
        return d, nil
    }

    return time.Sunday, fmt.Errorf("invalid weekday '%s'", v)
}

Тестирование:

fmt.Println(parseWeekday("Monday"))
fmt.Println(parseWeekday("Friday"))
fmt.Println(parseWeekday("invalid"))

Вывод (попробуйте на Go Playgorund ):

Monday <nil>
Friday <nil>
Sunday invalid weekday 'invalid'

Совет:

Вы можете даже использовать цикл for для безопасной инициализации карты daysOfWeekвот так:

var daysOfWeek = map[string]time.Weekday{}

func init() {
    for d := time.Sunday; d <= time.Saturday; d++ {
        daysOfWeek[d.String()] = d
    }
}

Тестирование и вывод одинаковы.Попробуйте это на Go Playground .

Еще одно приятное свойство этого решения карты (по сравнению с вашим решением для массива) состоит в том, что вы можете перечислить дополнительные допустимые значения на той же карте, которые могутбыть преобразован в time.Weekday без дополнительного кода синтаксического анализа.

Например, давайте также разберем трехбуквенные короткие названия дней недели в их time.Weekday эквивалент, например, "Mon" в time.Monday.

Это расширение можно добавить с помощью простого цикла:

var daysOfWeek = map[string]time.Weekday{}

func init() {
    for d := time.Sunday; d <= time.Saturday; d++ {
        name := d.String()
        daysOfWeek[name] = d
        daysOfWeek[name[:3]] = d
    }
}

Проверка его:

fmt.Println(parseWeekday("Monday"))
fmt.Println(parseWeekday("Friday"))
fmt.Println(parseWeekday("Mon"))
fmt.Println(parseWeekday("Fri"))
fmt.Println(parseWeekday("invalid"))

Вывод (попробуйте на Go Playground ):

Monday <nil>
Friday <nil>
Monday <nil>
Friday <nil>
Sunday invalid weekday 'invalid'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...