Go问答技术文章
-
Go 的 time.After 每调用一次都会得到一个新的定时器通道。循环中高频调用会增加定时器和分配开销,但 Go 1.23 起不再引用的未停止定时器可以被回收;需要反复等待时应改用可复用的 time.Timer。345 收藏 -
Golang · Go问答 | 4天前 | 并发 · channel · goroutine · Go问答 · Go channel 关闭 channel 接收零值 双值接收 range channel
Go channel 关闭后,接收操作会在没有更多数据时返回元素类型的零值。要区分真实业务零值与关闭信号,应使用双值接收的 ok 标志,或用 range 消费到结束;本文同时说明缓冲区残留、关闭责任和重复 close 的常见边界。345 收藏 -
解释 Go runtime/cgo.Handle 删除后的有效性边界:C 端继续回传旧句柄时,Go 侧 Value 会触发 panic,并给出回调停止、所有权交接和重复释放的处理方式。345 收藏 -
用 Go text/scanner 扫描数字时,先通过 TokenText() 保存原始字面量,再按 token 类型做数值转换,避免下划线、进制和指数写法在处理中丢失。342 收藏 -
解释 Go goroutine 因为没人接收 channel 而长期阻塞的原因,并用 context、select、关闭责任和等待机制设计可退出的发送路径。338 收藏 -
Golang · Go问答 | 5天前 | Context · HTTP客户端 · Go问答 · Go请求超时 Go clienttimeout http.Client Timeout Go客户端超时 Transport阶段超时
本文解释 Go http.Client.Timeout 的总时限范围,并用请求级 context 与 Transport 阶段参数区分不同客户端边界。338 收藏 -
Golang · Go问答 | 3天前 | go · Context · Go问答 · context.Cause Go context.WithCancelCause CancelCauseFunc Go 上下文取消原因 Go 下游读取取消原因
讲清 Go context.WithCancelCause 返回的 CancelCauseFunc 如何把具体错误传给下游,以及 context.Cause 与 ctx.Err 的区别、取消顺序和资源清理边界。338 收藏 -
sql.Conn.Raw 能让 Go 程序临时访问驱动连接,但回调结束后 database/sql 只根据返回错误判断连接是否还能用。本文解释修改驱动状态后的复用风险,以及何时应返回 driver.ErrBadConn。334 收藏 -
cgo 返回的 C 指针并非一律不能保存到 Go。本文区分 Go pointer 与 C pointer,说明 unsafe.Pointer 的持有边界、C.free 释放责任,以及 cgocheck 报错的排查方法。334 收藏 -
Go 的 //go:embed glob 没有匹配文件时会在构建阶段直接失败。本文从包目录、路径模式、单文件与 embed.FS 的差异出发,给出补文件、改路径和最小复查方法。333 收藏 -
Go select 中加入 default 后,消费者在没有消息时会立即返回,放进无限循环就可能形成高频空轮询。本文说明空转根因,并给出阻塞接收、定时退避、批处理和退出信号的选择边界。332 收藏 -
Go 中 <-chan 是只接收通道,close 只能作用于双向或只发送 channel。本文解释这个编译限制的设计原因,并给出生产者关闭、消费者安全接收的写法。332 收藏 -
旧式 Go // +build 语法中,空格表示候选项之间的 OR,逗号表示同一项中的 AND,多行约束还要继续做 AND。本文给出等价布尔式、现代 //go:build 写法和 go list 核对方法。331 收藏 -
解释 Go 中 unsafe.Pointer 与 uintptr 的生命周期差异,说明为什么地址整数不能长期保存,并给出受限偏移、真实指针、索引和检查工具的可执行判断方法。330 收藏 -
从 Go pprof goroutine profile 的等待状态和栈顶函数入手,区分通道、锁、网络、定时器与可运行协程,并说明何时切换到 block、mutex profile 或 trace。330 收藏