Правильный способ сопоставить объект

У меня простая задача.

  1. Поступает массив людей, до тысячи.
  2. Необходимо перебрать его и создать пользовательскую полезную нагрузку для внешней службы.

Я создал рабочее решение, но мне хотелось бы посмотреть, не сбился ли я с курса и какие изменения мне следует внести.

Я уменьшил неважные детали кода (ошибки и т.п.), поэтому это может не сработать. Но суть в том, чтобы показать, как это работает, и, надеюсь, получить совет.

User struct {
   Name        string  `json:"name"`
   Lastname    string  `json:"lastname"`
 }

func HandleLambda(event events.SQSEvent) {
 var userRecords []map[string]interface{}

 for idx := range event.Records {
  record := event.Records[idx]
  ev, err := e.NewEvent(record.Body)
  
  if err != nil {
    continue
  }

  u, err := repository.NewUser(ev)

  if err != nil {
        continue
  }

  user := make(map[string]interface{})
  user["1"] = u.Name
  user["2"] = u.Lastname

  userRecords = append(userRecords, user)
  }

 uJSON, _ := json.Marshal(userRecords)
 // I send this to external service

 }

Внешняя служба использует числа в качестве ключей, поэтому мне нужны «1» и «2». Я не могу это контролировать. Вот как это работает.

1 ответ
1

Думаю, тогда я мог бы. В качестве префикса: выглядит прекрасно, есть некоторые детали, которые можно улучшить, хотя они также зависят от вашей команды и руководства по стилю. Также читайте его в контексте более крупного проекта, не все всегда применимо, особенно если это одноразовый код и т. Д.

Я предполагаю (поскольку форматирование немного не работает), что вы используете
gofmt или же goimports уже, если вы этого не сделаете, проверьте их, это очень помогает.

Для User struct, даже если имя JSON lastname, считайте название Go-side LastName чтобы соответствовать нормальным руководствам по стилю. В зависимости от того, нужно ли вам это, аннотация JSON может также использовать
omitempty, но это, конечно, зависит от вашей внешней службы.

Для HandleLambda loop выделяются несколько вещей:

  • for idx := range event.Records с таким же успехом может быть
    for idx, record := event.Records, нет необходимости иметь дополнительную строку, чтобы получить фактический товар. И если ты им никогда не пользуешься,
    for _, record := event.Records четное.
  • Ошибки игнорируются? Подумайте о том, чтобы записать их в журнал, если не ошибитесь сразу.
  • user := make(map ...) Я обычно делал это буквально, чтобы не повторяться еще больше.
  • userRecords уже могут быть предварительно выделены для нужного размера, тогда не будет необходимости в append, или если вы используете continue как здесь, предварительно выделите максимальную длину, чтобы ее точно не пришлось изменять. Обычно также не имеет большого значения, если у вас не так много записей, но это полезно иметь в виду в ситуациях, когда
    делает иметь значение.
  • Также подумайте о том, чтобы сделать преобразование в карту новым методом на User, или вспомогательную функцию, вы можете протестировать ее или использовать в других местах.
  • repository выглядит как глобальная переменная, что обычно не лучшая идея. Подумайте о том, чтобы сделать это параметром для HandleLambda, или делая
    HandleLambda метод и поставить repository как один из ее членов. В конце концов, это поможет с тестируемостью, чтобы зависимости не были разбросаны подобным образом.
type User struct {
    Name     string `json:"name"`
    LastName string `json:"lastname"`
}

func (u *User) toMap() map[string]interface{} {
    return map[string]interface{
        "1": u.Name,
        "2": u.LastName,
    }
}

func HandleLambda(event events.SQSEvent) {
    userRecords := make([]map[string]interface, 0, len(event.Records))

    for _, record := range event.Records {
        ev, err := event.NewEvent(record.Body)
        if err != nil {
            continue
        }

        user, err := repository.NewUser(ev)
        if err != nil {
            continue
        }

        userRecords = append(userRecords, user.toMap())
    }

    uJSON, _ := json.Marshal(userRecords)
    // I send this to external service
}

  • 2

    Потрясающие. Я узнал новое из твоего ответа! Спасибо.

    — Вексони

  • У меня есть один вопрос. Вы упомянули: «userRecords уже могут быть предварительно выделены для нужного размера, тогда не будет необходимости в добавлении». Но добавление все еще используется?

    — Вексони

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *