У меня простая задача.
- Поступает массив людей, до тысячи.
- Необходимо перебрать его и создать пользовательскую полезную нагрузку для внешней службы.
Я создал рабочее решение, но мне хотелось бы посмотреть, не сбился ли я с курса и какие изменения мне следует внести.
Я уменьшил неважные детали кода (ошибки и т.п.), поэтому это может не сработать. Но суть в том, чтобы показать, как это работает, и, надеюсь, получить совет.
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 ответ
Думаю, тогда я мог бы. В качестве префикса: выглядит прекрасно, есть некоторые детали, которые можно улучшить, хотя они также зависят от вашей команды и руководства по стилю. Также читайте его в контексте более крупного проекта, не все всегда применимо, особенно если это одноразовый код и т. Д.
Я предполагаю (поскольку форматирование немного не работает), что вы используете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
}

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