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はどうなるのか?正しく後始末されるのか?