1.5.6 根据控制 Channel 的缓存大小来控制并发执行的 Goroutine 的最大数目.发生死锁

Author: mazezenCreated Apr 20, 2026Updated Apr 20, 2026
go
var limit = make(chan int, 3)
var work = []func(){
    func() { println("1"); time.Sleep(1 * time.Second) },
    func() { println("2"); time.Sleep(1 * time.Second) },
    func() { println("3"); time.Sleep(1 * time.Second) },
    func() { println("4"); time.Sleep(1 * time.Second) },
    func() { println("5"); time.Sleep(1 * time.Second) },
}

func main() {
    for _, w := range work {
        go func(w func()) {
            limit <- 1
            w()
            <-limit
        }(w)
    }
    select{}
}
bash
5
3
4
1
2
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [select (no cases)]:

Source: chai2010/advanced-go-programming-book