channel を利用したイテレータ実装
GIOの日記より
package main import ( "log"; "time"; ) func FibIter(n int) chan uint64 { ch := make(chan uint64); go func() { var a, b uint64 = 0, 1; for i := 0; i < n; i++ { ch <- a; a, b = b, a + b; } close(ch); }(); return ch; } func main() { for i := range FibIter(50) { log.Stdout(i); time.Sleep(1e8); } }
ただし、goroutine が thread などに比べて軽量だと言っても、数キロバイトを要する。 イテレータのためだけに goroutine を起動するのは、自分の選択には入らなそう。
0 件のコメント:
コメントを投稿