Wie verhält sich ein nicht initialisierter Kanal?

Ich habe eine Struktur, die einen Kanal enthält, der nicht initialisiert ist.

Wenn ich hineinschreibe, blockiert die Routine wie erwartet, aber der Leser wird nie benachrichtigt, dass sich etwas in der Pipe befindet.

Ich bin überrascht, dass es keinen Fehler gibt und ich frage mich, was los ist.

Im folgenden Beispiel wird weder die Meldungpushed Nochgot it werden gedruckt. (Kommentiere die Initialisierung aus und es wird wie ein Zauber funktionieren)

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")
}

ier ist der Spielplahttps: //play.golang.org/p/76zrCuoeo

(Ich weiß, ich sollte den Kanal initialisieren. Dies ist nicht der Zweck der Frage. Ich möchte wissen, was in Go mit nicht initialisierten Kanälen geschieht.)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage