I would likely go with something similar to how you would currently use
bufio.Scanner but comine the use of .Scan() and .Text() as Range()
```go
iter := rows.Iter(ctx)
for obj := iter.Range {
// do something with obj
}
if err := iter.Err(); err != nil {
return err
}
```
Or if rows can only have a single active iterator the there is no need for
the iter object
```go
for obj := rows.Range(ctx) {
// do something with obj
}
if err := rows.Err(); err != nil {
return err
}
```
Graham.
On Thursday, August 29, 2024 at 1:41:47 PM UTC+1 Dmitriy P wrote:
> What is the best way to handle errors with iterators?
>
> How to handle error when we have some object and some type paginates data
> (e.g. database/sql.Rows or
> https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#ListObjectsV2Paginator
> )?
> I found three, but which should be preferable or maybe I've missed some?
>
> ```go
> type Object smth.Smth
> type Paginator interface {
> GetNext(ctx) ([]Object, error) // func doing heavy request over internet
> HaveNext() bool
> }
> ```
>
> ```go
> func Iter(ctx, data) iter.Seq2[Object, error]
>
> for obj, err := Iter(...) {
> if err != nil {
> return err
> }
> // do smth with Object
> }
> ```
>
> ```go
> func IterWithErr(ctx, data, err *error) iter.Seq[Object]
>
> var err error
> for obj := IterWithErr(..., &err) {
> // do smth with Object
> }
> if err != nil {
> return err
> }
> ```
>
> ```go
> func IterOverIter(ctx, data) iter.Seq2[iter.Seq[Object], error]
>
> for page, err := IterOverIter(...) {
> if err != nil {
> return err
> }
> for obj := page(...) {
> // do smth with Object
> }
> }
> ```
>
>
>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/04859926-2b0c-4f19-a855-c0197584e3dfn%40googlegroups.com.