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) арналған функцияны жүзеге асырады. Код жалпы дұрыс, бірақ бірнеше жақсартуға болатын тұстары бар:
- SQL-да LIMIT және OFFSET әдетте
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
}
Осылайша, функция ресурстарды қауіпсіз түрде жабады және қателерді дұрыс өңдейді.