iter用法

iter提供Seq和Seq2两个生成方法,然后通过Pul拉取数据。目前标准库slices中,Collect,All 等方法将获取到的数据以iter.Seq方式返回。

package main

import (
	"fmt"
	"iter"
	"slices"
)

type user struct {
	name string
	age  int
}

func GenSeq1(n uint8) iter.Seq[user] {
	return func(yield func(user) bool) {
		for i := range n {
			if !yield(user{name: fmt.Sprintf("%d-%c", i, i+'a'), age: int(i + 10)}) {
				break
			}
		}
	}
}

func GetSeq2(n uint8) iter.Seq2[user, int] {
	return func(yield func(user, int) bool) {
		for i := range n {
			if !yield(user{name: fmt.Sprintf("%d-%c", i, i+'a'), age: int(i + 10)}, int(i)) {
				break
			}
		}
	}
}

func TryPull1() {
	seq := GenSeq1(26)
	next, stop := iter.Pull(seq)
	defer stop()
	for {
		v, ok := next()
		if !ok {
			break
		}
		fmt.Printf("[Seq1], username: %s, age: %d\\n", v.name, v.age)
	}
}

func TryPull2() {
	seq := GetSeq2(26)
	next, stop := iter.Pull2(seq)
	defer stop()
	for {
		v, index, ok := next()
		if !ok {
			break
		}
		fmt.Printf("[Seq2], [%d].name=%s, [%d].age=%d\\n", index, v.name, index, v.age)
	}
}

func main() {
	TryPull1()
	fmt.Println()
	TryPull2()
	seq := GenSeq1(26)
	users := slices.Collect(seq)
	for i := range users {
		fmt.Printf("[User] name: %s, age: %d\\n", users[i].name, users[i].age)
	}
}