Go lang — идиоматические запасные варианты по умолчанию

Я новичок в использовании Go (уже около 9 месяцев на полную ставку). Тем не менее, я привык к Python, typescript и PHP, и я всегда нахожу более короткий путь с этими языками. Тем не менее, я изо всех сил пытаюсь понять, что было бы самым идиоматичным способом добиться следующего:

transit := gin.H{
    "rise": rs.Rise.String(),
    "set":  rs.Set.String(),
}

if rs.Rise.IsZero() {
    transit["rise"] = nil
}

if rs.Set.IsZero() {
    transit["set"] = nil
}

По сути, я устанавливаю структуру по умолчанию, затем, если мне нужно изменить, я меняю... но мне это кажется неэффективным... поэтому мне интересно, есть ли здесь какие-нибудь приемы, которые я мог бы использовать?

Я выбрал этот конкретный реальный сценарий, но я рад, что у меня есть примеры (а не кодирование для меня)...

Что здесь означает «неэффективно»?

JimB 07.05.2022 14:57

@JimB Я должен исправить это на «подробный»

Micheal J. Roberts 07.05.2022 15:17

Многословие во многих случаях является плохой метрикой, сложность написания кода заключается не в количестве набранных символов, а в передаче намерений следующему читателю кода. Приведенное ниже решение не менее подробное в данном случае, и с большим количеством условий оно по-прежнему требует накладных расходов на отслеживание нескольких других абстракций. Если нет огромного количества опций для установки, я ожидаю увидеть простую серию условных выражений, чтобы справиться с этим в большинстве кодов.

JimB 07.05.2022 15:24

Да, полностью, это всегда борьба между удобочитаемостью и умом, языки, к которым я больше всего привык (Python, javascript и typescript), всегда обеспечивают определенный уровень умности в ущерб удобочитаемости ИМХО.

Micheal J. Roberts 07.05.2022 15:54
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
4
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не является неэффективным с точки зрения исполнения. Это может быть немного многословно по сравнению с другими языками. Есть способы сократить такой повторяющийся код с помощью анонимных функций. Это может помочь сократить длинный повторяющийся раздел без ущерба для удобочитаемости.

type StringZeroable interface {
   fmt.Stringer
   IsZero() bool
}

checkZero:=func(in StringZeroable) interface{} {
   if in.IsZero() {
     return nil
   }
   return in.String()
}

transit := gin.H{
    "rise": checkZero(rs.Rise),
    "set":  checkZero(rs.Set)
}

Другие вопросы по теме