PythonのitertoolsをGoで実装してみた
Just a practice.
イテレータの代わりにchan int
を引数に取るようにしました。
int
型しか受け付けないし、nth
repeat
などの単純な関数しか実装していません。
しかし、個人的な気付きがいくつか:
- 送信側(
ch <- x
する側)で、全データを送り終わった後にclose(ch)
を呼ばないと、受信側(x := <-ch
する側)が(ありもしない)次のデータ待ち続けてデッドロックが起きる chan
を受信側に渡す前に、値を突っ込もうとするとpanicになる:// NG ch := make(chan int) ch <- 1 // panic! reciever(ch) // OK ch := make(chan int) go func() { ch <- 1 // panic! }() reciever(ch)
したがって、
chan
に値を突っ込む操作は、普通はgoroutineの中で行うことになる。chan int
としてのnil
は「空だがcloseされていないchan int
」のような扱いなのでx <- nil
はデッドロックになる?- よって、(当たり前だが)値を突っ込む前の
make(chan int)
とnil
は異なる - 疑問点:受信側が
chan
の値を、全部引き出さずに終わった場合(chan
を途中で捨てた場合)、送信側のgoroutineはどうなるのか?正しく後始末されるのか?