В данном коде на Go реализована функция для получения ID активных заказов с пагинацией (offset и limit). Код в целом корректен, но есть несколько моментов, которые можно улучшить:
func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) {
В данном коде на Go реализована функция для получения ID активных заказов с пагинацией (offset и limit). Код в целом корректен, но есть несколько моментов, которые можно улучшить:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) { var ( res []uint32 args []interface{} )
query := `SELECT id FROM "order" WHERE is_terminated = false LIMIT $1 OFFSET $2;`
args = append(args, limit, offset)
rows, err := r.slave.Query(ctx, query, args...)
if err != nil {
return nil, err
}
for rows.Next() {
var orderID uint32
if err = rows.Scan(&orderID); err != nil {
return nil, err
}
res = append(res, orderID)
}
return res, nil
}
Ответ
В данном коде на Go реализована функция для получения ID активных заказов с пагинацией (offset и limit). Код в целом корректен, но есть несколько моментов, которые можно улучшить:
- Порядок LIMIT и OFFSET в SQL обычно
LIMIT $1 OFFSET $2, что соблюдено. - Лучше использовать
defer rows.Close()сразу после проверки ошибки, чтобы гарантировать закрытие курсора. - Можно использовать
rows.Err()после цикла для проверки ошибок итерации.
Пример улучшенного варианта:
func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) {
var res []uint32
query := `SELECT id FROM "order" WHERE is_terminated = false LIMIT $1 OFFSET $2;`
rows, err := r.slave.Query(ctx, query, limit, offset)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var orderID uint32
if err := rows.Scan(&orderID); err != nil {
return nil, err
}
res = append(res, orderID)
}
if err := rows.Err(); err != nil {
return nil, err
}
return res, nil
}
Таким образом, функция безопасно закрывает ресурсы и корректно обрабатывает ошибки.