func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) {

В данном коде на Go реализована функция для получения ID активных заказов с пагинацией (offset и limit). Код в целом корректен, но есть несколько моментов, которые можно улучшить:

Короткий ответ

Что ответить на собеседовании

В данном коде на 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). Код в целом корректен, но есть несколько моментов, которые можно улучшить:

  1. Порядок LIMIT и OFFSET в SQL обычно LIMIT $1 OFFSET $2, что соблюдено.
  2. Лучше использовать defer rows.Close() сразу после проверки ошибки, чтобы гарантировать закрытие курсора.
  3. Можно использовать 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
}

Таким образом, функция безопасно закрывает ресурсы и корректно обрабатывает ошибки.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку