Go问答技术文章
-
Golang · Go问答 | 1个月前 | 并发 · channel · select · 性能排查 · Go问答 · select Go channel context default CPU飙高 忙等循环 ticker
Go select 里的 default 会在没有 channel 就绪时立即返回;如果外层套着无限 for,就会形成忙等循环,让 CPU 空转。更稳的写法是阻塞等待、用 ticker 控制检查频率,并用 context 处理退出。438 收藏 -
Golang · Go问答 | 3星期前 | channel · sync.Cond · 架构设计 · 并发编程 · Go问答 · Go channel 条件变量 sync.Cond 并发等待 广播唤醒
Go 的 sync.Cond 和 channel 都能让 goroutine 等待,但它们解决的不是同一个问题。本文从库存闸门和批量任务队列两个场景出发,比较条件变量的广播唤醒、channel 的消息传递、锁边界和关闭语义,并给出可运行的最小写法与选型判断。432 收藏 -
Golang · Go问答 | 22小时前 | 并发 · 错误处理 · go · Context · 取消原因 WithCancelCause Go context.Cause context.Err
context.Err 只能告诉调用方请求已取消或超时,context.Cause 才能保留触发取消的具体原因。本文用一个可运行的 Go 示例说明 WithCancelCause、Cause 和 Err 的关系,以及父子 context 竞争取消时的边界。428 收藏 -
Golang · Go问答 | 1个月前 | 并发 · channel · range · Close · Go问答 · 并发退出 Channel关闭 Go问答 close channel range退出 发送方关闭
Go channel 关闭后仍然可以把缓冲区里的值读完,再继续读取会得到元素类型的零值和 ok=false;但关闭后的 channel 不能再写入,也不能重复关闭。真正安全的关键是让发送方统一负责关闭,并让接收方用 range 或 ok 值退出。427 收藏 -
Golang · Go问答 | 18小时前 | golang · TLS · Go问答 · Go 1.26 · crypto/tls · 安全升级 · crypto/tls Go 1.26 ML-KEM 后量子密码 TLS兼容性
Go 1.26 默认开启 TLS 后量子混合密钥交换。本文用 Go 客户端和服务端最小实验说明协商结果怎么观察、旧客户端如何做灰度验证,以及 tlssecpmlkem 开关和回退边界。420 收藏 -
批量计算文件 SHA-256 时,直接为每个文件启动 goroutine 很容易把磁盘和句柄拖满。本文用一个可取消的小工具演示如何用 context、固定 worker 数和结果汇总,把停止、错误和部分结果处理清楚。419 收藏 -
围绕 Go defer 在循环中的常见误用,解释为什么文件、连接、锁等资源会等到函数返回才释放,并给出函数拆分、显式关闭和错误处理的实战写法。418 收藏 -
Golang · Go问答 | 2星期前 | 标准库 · bufio · 网络协议 · Go问答 · 流式读取 · peek Go bufio.Reader 协议解析 Go问答 Discard UnreadByte
Go 用 bufio.Reader 解析带长度或分隔符的协议时,Peek 只是查看缓冲内容,不会推进读取位置;Discard 才会消费字节。本文用一个简化帧协议拆开 Peek、Read、Discard、UnreadByte 的数据流转和边界处理。414 收藏 -
sync.Cond 的难点不是调用 Broadcast,而是让共享状态、锁和等待条件保持同一条时间线。本文用一个任务队列场景拆解 Wait、Signal、Broadcast 的正确顺序、常见误区与可验证写法。410 收藏 -
用 Go encoding/csv 完成一套可复查的 CSV 入库流程:去掉 UTF-8 BOM,跳过空行,校验列数,规范化字段,并用唯一键和事务处理重复记录。408 收藏 -
Go 错误判断不要只比较 Error() 字符串。本文用最小示例拆开 fmt.Errorf 的 %w、errors.Join 的多分支包装和自定义 Is 方法,说明 errors.Is 什么时候能匹配、为什么 errors.Unwrap 对 Join 不够用,以及如何写出可回归的错误契约。407 收藏 -
Go 切片赋值只复制描述符,不会复制底层数组。本文对比直接赋值、copy 和 slices.Clone,演示子切片修改如何影响原数据,并说明 nil、容量和 API 返回值的选择。405 收藏 -
用一个小型 Go 日志筛选器说明如何同时支持文件参数和标准输入,处理参数优先级、逐行读取、字段校验、错误退出码以及管道联调。403 收藏 -
Golang · Go问答 | 3星期前 | golang · HTTP · Context · 并发编程 · context.Context context.WithTimeout Go HTTP 超时
Go 服务调用 HTTP、数据库或 RPC 时,超时不能只靠客户端等待。本文用 context.WithTimeout 给请求链路加上可传播的截止时间,并说明 cancel、父子 Context、select 和错误判断的常见坑。397 收藏 -
sync.Cond 的 Wait、Signal 和 Broadcast 不是消息队列,正确用法是持锁检查条件、循环等待,并在状态变化后通知。本文用任务队列示例解释信号丢失、虚假唤醒和关闭退出的处理边界。393 收藏