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]
細かいところグダグダだし、テストもしてないです。