無根生

無根生

从官方库学到了写代码的新方式(1)

这个系列会比较简短,当做便签使用吧

从官方库 xue 到的新的使用方式,最近打算重写项目,打算从别的库找找灵感,看看他们是怎么处理 SSE 的数据流的,看了 gemini golang 的库,他用到了 iter,Seq2 这个来生成迭代器函数

函数签名是这样的

type Seq2[K, V any] func(yield func(K, V) bool)

下面简单写一个例子

package main

import (
	"fmt"
	"iter"
)

func iterateArray(a []string) iter.Seq2[string, error] { 
	return func(yield func(string, error) bool) {
		for _, s := range a {
			if s == "exit" {
				yield("", fmt.Errorf("exit")) //返回错误并中断
				return 
			}
			if !yield(s, nil) { // if yield returns false, stop iterating
				return
			}
		}
	}
}

func main() {
	ia := iterateArray([]string{"a", "b", "c", "exit", "d"})
	for k, v := range ia {
		fmt.Println(k, v)
	}
}

当你使用 for range 来遍历 iterateArray 返回的序列时,for range 循环机制会提供这个 yield 函数。

yield 返回 false 表示 for range 中断了,停止迭代

当接收到 "exit" 迭代器主动停止

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.