Hi,
I would like to improve performance by preallocation slice (var posts []*PostModel
) or by doing something else but not sure how to do that without knowing how many records rows
has. Hence reason I have to use posts = append(posts, post)
. Could please someone give me an idea?
Thanks
Note: I have same issue in all RDBMS packages like sql/database, MySQL, Postgres pg, pgx so on.
func (s Storage) ListPostsByUser(ctx context.Context, args ListPostsByUserArgs) ([]*PostModel, error) {
ctx, cancel := context.WithTimeout(ctx, s.timeout)
defer cancel()
qry := fmt.Sprintf(`
SELECT
id, user_id, text, created_at, deleted_at
FROM posts
WHERE user_id = $1
ORDER BY %s
LIMIT $2
OFFSET $3
`,
args.OrderBy,
)
rows, err := s.Query(ctx, qry, args.UserID, args.Limit, args.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
// START: Try to enhance starting from here --------------------------------
var posts []*PostModel
for rows.Next() {
post := &PostModel{}
err := rows.Scan(
&post.ID,
&post.UserID,
&post.Text,
&post.CreatedAt,
&post.DeletedAt,
)
if err != nil {
return nil, err
}
posts = append(posts, post)
}
// END: End of enhancement -------------------------------------------------
if err := rows.Err(); err != nil {
return nil, err
}
return posts, nil
}