I like this approach.

   - bufio.Scanner-style errors are a known pattern from the stdlib
   - The approach keeps the key and value params free for their intended use
   - It doesn't require nested iter seqs
   - It is compatible with range loops

Made some sample code as PoC -> https://go.dev/play/p/6qhH6ZN6f0S (Doesn't 
work in the playground due to network restrictions)

On Saturday, August 31, 2024 at 1:38:53 PM UTC+2 gbarr wrote:

> 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/51042ae0-141d-452b-b1f0-94ff17cbe23cn%40googlegroups.com.

Reply via email to