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)
}
}