Go语言技术文章
-
Go 服务需要持续观察 goroutine 数量、调度队列和等待延迟时,可以使用标准库 runtime/metrics,而不必依赖 pprof。本文从 All 和 Read 的采样入口讲到 Value.Kind、计数值与直方图处理,并说明两者在生产观测中的分工。214 收藏 -
Go sync.Map.Range 能安全地遍历并发 Map,却不保证一次一致快照。本文从线上统计读数漂移切入,解释并发 Store/Delete 的影响、回调边界和需要快照时的替代方案。428 收藏 -
Go context.AfterFunc 适合绑定超时、上游取消等退出路径的补偿清理。本文用连接读截止时间示例说明 stop 返回值、清理完成同步、幂等和正常完成路径的边界。375 收藏 -
Go 按字节限制输出长度时,使用 utf8.RuneStart 找到 UTF-8 字符边界,并结合 utf8.Valid 与 DecodeRune 处理非法或不完整编码。361 收藏 -
Go context.Err 负责返回统一的取消类别,context.Cause 用来读取更具体的取消原因。使用 WithCancelCause 时,Err 可能是 context.Canceled,而 Cause 可以返回业务错误。382 收藏 -
runtime.GOMAXPROCS 限制的是同时执行用户级 Go 代码的并行度,不是操作系统线程总数。本文用 G、P、M 和阻塞系统调用说明线程数为何可能高于设置值,并给出容器与本地程序的排查顺序。477 收藏 -
Go 反射中,Value.Elem 遇到 nil 指针会返回 zero Value。先用 IsValid 判断,再对可空 Kind 调用 IsNil,并在每次 Elem 后保留成功标志,就能避免继续访问无效 Value。403 收藏 -
Go 的 utf8.DecodeRuneInString 遇到非法 UTF-8 时返回 RuneError 和 size=1,空字符串则返回 size=0。本文用原创示例说明如何按字节推进、区分合法替换字符,并处理分块读取的字符边界。109 收藏 -
Go 反射中,reflect.Value.IsZero 可直接判断有效值是否为类型零值,不要求切片、映射和函数可比较。本文区分无效 Value、nil 容器、空容器与接口比较 panic,并说明何时使用 Comparable 或 DeepEqual。197 收藏 -
Go 的 string 可以保存任意字节,不能只凭字符串类型判断文本合法性。本文用 unicode/utf8.ValidString 做入口校验,并结合 DecodeRuneInString 定位第一个非法 UTF-8 字节。209 收藏 -
Go checkptr 报错通常可归到指针对齐、跨分配对象或指针算术越界三类问题。本文结合 unsafe.Pointer、uintptr 和原始分配对象,说明如何定位并修复不安全转换。347 收藏 -
unsafe.StringData 返回的是字符串底层字节的只读 *byte。本文区分 Go 指针、uintptr 和 cgo 边界,说明空字符串、NUL 结尾、KeepAlive 与长期保存的正确处理方式。316 收藏 -
解释 Go runtime.KeepAlive 为什么要紧跟系统调用放置,帮助排查 finalizer 过早关闭文件描述符导致的偶发 EBADF。316 收藏 -
Go database/sql 事务不能简单理解为 Commit 失败后再 Rollback。本文用可复用代码说明提交前错误的回滚写法,以及提交错误后的未知状态、幂等和对账处理。339 收藏 -
database/sql.QueryContext 返回的 Rows 可能仍占用驱动连接。本文用可复用的 Go 代码说明为什么要 Close、何时检查 Rows.Err,以及查询提前退出时如何避免连接池被拖住。258 收藏