golang chan总结

本文详细探讨了Go语言中chan的核心概念,包括无缓冲chan的同步特性,进和出如何阻塞;有缓冲chan作为FIFO队列的工作原理,以及在满载和空载情况下的行为;还重点介绍了select关键字的使用,解释了其遍历case的机制,以及在多个case阻塞和存在default时的行为。了解这些对于掌握Go并发编程至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

goroutine和chan配合是golang的核心技术, 必须深入研究一下使用方法.

无缓冲chan

进和出都会阻塞.


例1:

func main() {
    ch := make(chan error)
    fmt.Println("main1")
    go func() {
        fmt.Println("go1")
        ch <- nil //阻塞
        fmt.Println("go2") //永远不会执行
    }()
    fmt.Println("main2")
    time.Sleep(1 * time.Second)
    fmt.Println("main等待1秒")
    fmt.Println("main3")
}
输出: 
main1
main2
go1
main等待1秒
main3

例2:

func main() {
    ch := make(chan error)
    fmt.Println("main1")
    go func() {
        fmt.Println("go1")
        fmt.Println("go等待1秒")
        time.Sleep(1 * time.Second)
        ch <- nil //阻塞等待
        fmt.Println("go2")
    }()
    fmt.Println("main2")
    fmt.Println("main等待1秒")
    time.Sleep(1 * time.Second)
    <-ch //阻塞等待
    fmt.Println("main3")
    time.Sleep(2 * time.Second)
}
输出: 
main1
main2
main等待1秒
go1
go待1秒
main3
go2

有缓冲chan

先进先出队列, 出会一直阻塞到有数据, 进时当队列未满不会阻塞, 队列已满则阻塞.


select

  1. select 先遍历所有case, 所有channel表达式都会被求值、所有被发送的表达式都会被求值。求值顺序:自上而下、从左到右.
  2. 当case没有阻塞则随机执行一个没有阻塞的case就退出select
  3. 当所有case阻塞时, 则一直阻塞直到某个case解除阻塞, 但是如果有default则直接执行default
  4. 也就是一个select最多只执行一次case里的代码
  5. 要一直检测case则必须外层使用for循环包起来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值