为什么下面的代码示例经过几次迭代后仍然卡住?

I am trying to learn golang and i got a little piece of code that i do not understand why it gets stuck after some time.

package main

import "log"

func main() {
    deliveryChann := make(chan bool, 10000)

    go func() {
        for {
            deliveryChann <- true
            log.Println("Sent")
        }
    }()

    go func() {
        for {
            select {
            case <-deliveryChann:
                log.Println("received")
            }
        }
    }()

    go func() {
        for {
            select {
            case <-deliveryChann:
                log.Println("received")
            }
        }
    }()

    go func() {
        for {
            select {
            case <-deliveryChann:
                log.Println("received")
            }
        }
    }()

    for {
    }
}

An basic start on how to investigate would suffice.

The main goroutine (running the for {} loop) is hogging the thread, and none of the other goroutines are able to execute because of it. If you change the end of your main function to:

for {
    runtime.Gosched()
}

then the thread will be released and another goroutine made active.

func Gosched()

Gosched yields the processor, allowing other goroutines to run. It does not suspend the current goroutine, so execution resumes automatically.

-- https://golang.org/pkg/runtime/#Gosched

Order of execution of goroutings is undefined. Code gets stuck is legal. You can be more deterministic doing communication with main(). For example place

for {
   deliveryChann <- true
   log.Println("Sent")
}

in main() instead of go func()