2016-08-18 5 views
5

私は初期化されていないチャネルを保持する構造体を持っています。私はそれに書き込むとき初期化されていないチャネルはどのように動作しますか?

、ルーチンが期待通りにブロックしているが、読者は何かがパイプであることを通知されることはありません。

私はエラーがなく、何を行っているのだろうと驚いています。例えばベローズで

、どちらのメッセージpushedgot itが印刷されています。 (コメントを外して使う初期とそれが魅力のように動作します)

type MyStruct struct { 
    over chan bool 
} 

func main() { 
    nonInitialized := &MyStruct{} 
    // nonInitialized.over = make(chan bool) 
    go func() { 
     for i := 0; i < 10; i++ { 
      select { 
      case <-nonInitialized.over: 
       fmt.Println("got it") 
      default: 
       // proceed 
      } 
      fmt.Println("do some stuff") 
      time.Sleep(10 * time.Millisecond) 
     } 
     panic("took too long") 
    }() 
    // push on the non initialized channel 
    fmt.Println("pushing") 
    nonInitialized.over <- true 
    fmt.Println("pushed") 
} 

ここで遊び場がhttps://play.golang.org/p/76zrCuoeoh

です(私はチャンネルを初期化する必要があります知っている、これは質問の目的ではない、私が知りたいです何が非初期化チャンネルを移動中に起こっている。)

答えて

7

「初期化されていない」フィールドまたは変数がnilあるすべてのチャネルタイプのzero valueを持つことになります。そこで、nilチャネルまたはそのチャネル上の操作がどのように動作するかを調べてみましょう。

チャネル公理つのポストで収集価値がある:(Spec: Receive operator)永遠nilチャネルブロックから受け取る

  • Spec: Send statements)永遠

    • nilチャネルブロックの送信を
    • 閉鎖されたチャネルへのパニック(Spec: Send statements
    • a rece閉じたチャネルからIVEはnilチャネルの場合に遮断するため、直ちに

    推論(Spec: Receive operator)ゼロ値を返す:チャネル値がnilであれば、誰もそれへの参照を持っていないので、誰も準備ができませんそれから受け取る(我々が送りたいもの)。私たちがそれから受け取るものを何でも送ってください。

    あなたはDave Cheney: Channel Axiomsでこれについてさらに推論と詳細情報を読むことができます。完全のために

    • Closingnilチャネルが(ちょうど既に閉じチャンネルを閉じるように)run-time panicの原因となります。
    • Length and capacitynilチャンネルは0です。長さおよび容量が0nilスライスおよびマップに従って、

    推論:(一方のみnilチャネルはなく、「閉」用と「閉じない」チャネルのための1つが存在する)状態であるが、nilチャネル状態を持つことができない「閉じました」。 nilチャネルにキューイングされている要素はありません(len = 0なので)。バッファー容量はありません(cap = 0)。

    4

    これは正常な動作です。 nilチャンネルへの送信は永遠にブロックされます。あなたはここの仕様でそれについて読むことができます:https://golang.org/ref/spec#Send_statements

    これはnilチャンネルの受信にも当てはまります。 (https://golang.org/ref/spec#Receive_operator

    また、参考のために便利な、このリンクを維持することができます:channel typehttp://dave.cheney.net/2014/03/19/channel-axioms

    関連する問題