Go言語でリストを一定の長さに分割してみる

昨日pythonでやったのをGoの練習として書いてみた。

goroutineとチャネルでジェネレータっぽい処理をするのとかは、以下のエントリを参考にさせていただきました。

参考 : Pythonista向けGo言語入門 ― PythonMatrixJp

package main

import (
	"fmt"
)

func step(start int, last int, step int) chan int {
	ch := make(chan int)
	go func() {
		for i := 0; i < last/step+1; i++ {
			ch <- i * step
		}
		close(ch)
	}()
	return ch
}

func chunks(l []interface{}, n int) chan []interface{} {
	ch := make(chan []interface{})

	go func() {
		for i := range step(0, len(l), n) {
			m := i + n
			if m > len(l) {
				m = len(l)
			}
			chunk := l[i:m]
			ch <- chunk
		}
		close(ch)
	}()
	return ch

}

func main() {
	lst := []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
	for e := range chunks(lst, 3) {
		fmt.Println(e)
	}
}

実行結果

[1 2 3]
[4 5 6]
[7 8 9]
[10 11 12]
[13]

細かいところグダグダだし、テストもしてないです。