用select对channel进行多路复用

    技术2022-07-11  121

    先看代码:

    func main() { ch := make(chan int, 1) for i := 0; i < 10; i++ { select { case x := <-ch: fmt.Println(x) case ch <- i: fmt.Println("--", i) } } }

    为什么输出0 2 4 8?

    -- 0 0 -- 2 2 -- 4 4 -- 6 6 -- 8 8 ch的buffer size是1,这个通道的状态要么是full,要么是empty

    当i是0时,通道是empty,执行send,输出-- 0

    当i是1时,通道是full,send阻塞,执行receive,输出0

    当i是2时,通道是empty,执行send,输出-- 2

    以此类推

    Processed: 0.017, SQL: 9