Ситуация следующая. По http приходит некая сложная структура данных в виде JSON. Внутри различные даты в виде строк "2006-01-02". Налету у меня эти строки конвертировать в time.Time не получается, просто указав этот тип в принимающей структуре, т.к. там нельзя указать нестандартный формат даты (по крайней мере я к такому выводу пришел. Если ошибаюсь, подскажите как). Поэтому принимаю я данные в виде строк.
type input struct {
Renting_period period
Reservations reservations
}
type reservations []*period
type period struct {
Start date
End date
}
type date string
В итоге структура вполне меня удовлетворяет, кроме небольшой детали. Т.е. мне надо манипулировать датами (отсортировать, посчитать промежутки в днях и т.д.), то мне нужно сконвертировать строковый тип date в time.Time. Сделал я это с помощью создания метода для этого типа
func (d date) toTime() time.Time {
timeObj, err := time.Parse("2006-01-02", string(d))
if err != nil {
panic(err)
}
return timeObj
}
И вот тут и кроется потенциальная проблема. Вообще в обычной ситуации все красиво: у меня получается обращаться к полям с датой, получать значения в виде временного объекта и манипулировать им
...
reservation.End.toTime().AddDate(0, 0, 1)
...
Но в коде метода легко увидеть наличие возможной ошибки и вызов panic. Естественно, во входящих данных может быть дата в неправильном формате или еще какие невалидные данные, соответственно, мне надо на ошибку реагировать нормально и отдавать по http ответ с ошибкой. И вроде бы можно было сделать у метода возврат не единственного значения, а еще и ошибку, которую обрабатывать в вызывающей функции, но проблема в том. что этот метод вызывается внутри сортировки sort. А там я не понял, есть ли возможность получать и передавать ошибки. По той же причине, я не могу в этот метод передавать w http.ResponseWriter, т.к. из функций, реализующих интерфейс сортировки, я не знаю как передавать его в метод.
func (r reservations) Len() int {
return len(r)
}
func (r reservations) Swap(a, b int) {
r[a], r[b] = r[b], r[a]
}
func (r reservations) Less(a, b int) bool {
return r[a].Start.toTime().Sub(r[b].Start.toTime()) < 0
}
Возможно, ответ очевиден и у меня сказывается отсутствие опыта написания веб сервиса именно на го, и наверняка есть правильный путь разруливания таких вещей. Потому и обращаюсь за помощью. Еще есть подозрение, что можно как-то по-другому преобразовать тип даты в правильный, но сам пока не нашел.