Sobes.tech
Principal

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 }

sobes.tech AI

AI-дан жауап

Бұл Go тілінде актив тапсырыстардың ID-ін алу үшін пагинациямен (offset және limit) арналған функцияны жүзеге асырады. Код жалпы дұрыс, бірақ бірнеше жақсартуға болатын тұстары бар:

  1. SQL-да LIMIT және OFFSET әдетте 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
}

Осылайша, функция ресурстарды қауіпсіз түрде жабады және қателерді дұрыс өңдейді.