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.