go的chan

无缓冲区channel

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int) // 创建无缓冲channel
    go func() {
        fmt.Println("time sleep 5 second...")
        time.Sleep(5 * time.Second)
        <-ch
    }()
    fmt.Println("即将阻塞...")
    ch <- 1 // 协程将会阻塞,等待数据被读取
    fmt.Println("ch 数据被消费,主协程退出")
}

结果,消费完才能继续

即将阻塞...
time sleep 5 second...
ch 数据被消费,主协程退出

有缓冲区channel

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 1) // 创建有缓冲channel
    go func() {
        fmt.Println("time sleep 5 second...")
        time.Sleep(5 * time.Second)
        <-ch
    }()
    ch <- 1 // 协程不会阻塞,等待数据被读取
    fmt.Println("第二次发送数据到channel, 即将阻塞")
    ch <- 1 // 第二次发送数据到channel, 在数据没有被读取之前,因为缓冲区满了, 所以会阻塞主协程。
    fmt.Println("ch 数据被消费,主协程退出")
}

总体原则就是缓冲区默认为0,缓冲区不满不阻塞

带缓冲通道被填满时,尝试再次发送数据时发生阻塞。
带缓冲通道为空时,尝试接收数据时发生阻塞。

参考资料:
http://www.zzvips.com/article/71666.html

标签: none

添加新评论