v := min return func(yield func(v int) bool) { for v < max { yield(v) v++ } } } func main() { for v := range generator(5, 10) { fmt.Println(v) } } Push型での呼び出しと実行結果
int, range over func · Issue #61405 · golang/go · GitHub のコメントでループ毎にエラー処理したいケースに適したやり方として提案 2. イテレータを生成する関数にエラー型変数へのポインタを渡して代入 a. spec: add range over int, range over func · Issue #61405 · golang/go · GitHub のコメントでエラー発生時にループを継続できなくなるケースに適したやり方として提案 3. 他 a. panic(err) して呼び出し側で recoverする b. error型のフィールドを持つ構造体をyield()で返す
b. Cons i. エラーに追加で返せる値が1つ以下に限定される 2. イテレータを生成する関数にエラー型変数へのポインタを渡して代入 a. Pros: i. 返せる値が最大の2つのまま b. Cons: i. 一般的なエラー処理ではない ii. エラー変数のスコープが広い 理由がなければ、 なじみ深い1のほうがおすすめ