Go. Как возвращать ошибки из метода?

Ситуация следующая. По 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
}


Возможно, ответ очевиден и у меня сказывается отсутствие опыта написания веб сервиса именно на го, и наверняка есть правильный путь разруливания таких вещей. Потому и обращаюсь за помощью. Еще есть подозрение, что можно как-то по-другому преобразовать тип даты в правильный, но сам пока не нашел.
  • Вопрос задан
  • 414 просмотров
Решения вопроса 1
bitver
@bitver
func (d date) toTime() time.Time {
  return time.Parse("2006-01-02", string(d))
}

...
time, err := reservation.End.toTime()
if err != nil {
...
}
time.AddDate(0, 0, 1)
...

func (r reservations) Less(a, b int) bool {
  aTime, _ := r[a].Start.toTime()
  bTime, _ := r[b].Start.toTime()
  return aTime.Sub(bTime) < 0
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы