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 golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/04859926-2b0c-4f19-a855-c0197584e3dfn%40googlegroups.com.

Reply via email to