PythonのitertoolsをGoで実装してみた

Just a practice.

go-itertools

イテレータの代わりに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はどうなるのか?正しく後始末されるのか?

ともかく、Golangchanと、Pythonのジェネレータ関数は色々異なるので、注意しなくちゃいけませんな。