0

0

如何使用Go channel传递数据_Go通道读写规则说明

P粉602998670

P粉602998670

发布时间:2026-01-19 17:13:26

|

644人浏览过

|

来源于php中文网

原创

channel必须先初始化才能使用;未初始化的channel为nil,读写会永久阻塞;make(chan int)创建无缓冲channel,make(chan string, 10)创建容量为10的缓冲channel。

如何使用go channel传递数据_go通道读写规则说明

channel必须先初始化才能使用

未初始化的 channelnil,对它进行读或写操作会永久阻塞(goroutine 永久挂起),这是 Go 中最常见的死锁源头之一。

  • make(chan int) 创建无缓冲 channel;make(chan string, 10) 创建容量为 10 的缓冲 channel
  • 判断 channel 是否为 nil:直接用 ch == nil,但生产代码中应避免依赖此判断,而应确保初始化逻辑不被跳过
  • 函数接收 channel 参数时,调用方传入 nil channel 是合法语法,但会导致调用即阻塞 —— 所以接口文档或注释里应明确要求“非 nil”

向已关闭的 channel 写数据会 panic

Go 运行时会在向已关闭的 chan 执行 ch 时触发 panic: send on closed channel。但读已关闭的 channel 是安全的:返回零值 + false(如果带 ok 返回)。

  • 关闭 channel 的责任通常属于发送方;接收方不应 close,也不应假设自己能“最后一个关闭”
  • 多个 goroutine 并发写同一 channel 时,不能靠“谁先 close 谁赢”,必须用额外同步机制(如 sync.Once)确保只 close 一次
  • 常见误写:
    close(ch)
    ch <- 42 // panic!

无缓冲 channel 的读写必须配对才不阻塞

无缓冲 channel 相当于一个同步点:每次 操作都要求对方 goroutine 同时准备好另一端操作,否则当前 goroutine 阻塞。

MaxAI
MaxAI

MaxAI.me是一款功能强大的浏览器AI插件,集成了多种AI模型。

下载
  • 发送方阻塞直到有接收方就绪;接收方阻塞直到有发送方就绪
  • 典型陷阱:在 main goroutine 中向无缓冲 channel 发送,但没启动接收 goroutine —— 程序立即死锁
  • 调试建议:用 go run -gcflags="-l" main.go 关闭内联后加 log.Println("sent"),可快速定位卡在哪一行
  • 示例(会死锁):
    ch := make(chan int)
    ch <- 1 // main 卡在这里,永远等不到接收者

range 遍历 channel 会自动等待关闭

for v := range ch 本质是持续接收,直到 channel 关闭且缓冲区为空。它隐式处理了“读完所有已发送值再退出”的逻辑,比手动 for { select { case v := 更简洁。

  • range 不会因 channel 暂时空而提前退出;它只响应 close() 信号
  • 如果发送方永不 close,range 永远不会结束 —— 所以务必确认关闭时机(例如:所有发送 goroutine 结束后)
  • 无法用 range 判断 channel 是否“正在被写入”,也无法从中途停止遍历(除非用 break 配合外部条件)
  • 带缓冲 channel 的 range 会读出所有现存值,然后阻塞等待新值或关闭;关闭后退出循环

关闭 channel 的时机和主体容易混淆,尤其在多生产者场景下 —— 它不是“谁最后发完谁关”,而是需要协调机制。别指望 runtime 帮你推断意图。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1024

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

450

2025.12.29

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号