Go语言技术文章
-
线上只拿到一个 Go 二进制时,debug.BuildInfo 可以帮助你还原构建工具链、主模块、依赖模块与 VCS 设置。本文用 ReadFile 和 ReadBuildInfo 组成一套发布验收流程,并说明模块模式、裁剪信息与脏工作区的边界。200 收藏 -
Go 1.23 引入的 unique.Make 可以把可比较值规范化为 Handle。本文用同一组重复字符串复现实例,核对句柄相等、Value 取回和可回收缓存的边界。200 收藏 -
Go 1.22 及以上的 slices.Delete 会清零删除后的尾部元素。本文用指针切片说明为什么必须接住返回值,以及旧写法、切片别名和 Clone 应该怎样处理。200 收藏 -
使用 Go 标准库 multipart.Writer 同时写入普通字段和文件字段,正确关闭 Writer、绑定带 boundary 的 Content-Type,并从资源、输入与审计角度排查上传请求问题。200 收藏 -
解释 go test 输出 (cached) 的原因,区分测试二进制、命令参数、环境变量和文件输入,并给出 -count=1、GODEBUG=gocachetest=1 与 go clean -testcache 的排查用法。200 收藏 -
Go 的 string 按字节保存,按字节截断中文或表情可能切入 UTF-8 编码中间。本文用 unicode/utf8 设计安全的字节上限切分函数,并说明非法输入、rune 计数和性能边界。200 收藏 -
Go 的 VerifyConnection 明确覆盖普通握手和恢复握手,用于保证自定义连接约束不会被会话恢复绕过。本文结合 DidResume、ClientSessionCache 与 HTTP 长连接复用说明调用边界和排查方法。200 收藏 -
复用 Go 的 time.Timer 时,Reset 的安全关键不是重新设置时长,而是先确认旧定时器是否停止、是否仍有到期信号,以及是否存在多个 goroutine 同时消费 C。本文用单次超时循环拆解 Stop、Reset、timer.C 和并发读取的边界。199 收藏 -
Go 结构体同时保存 map 和 sync.Mutex 时,值接收者会复制锁而不是复制同一把锁。本文说明 map 与 mutex 的复制差异,并给出指针接收者、Mutex/RWMutex 选择和竞态排查方法。199 收藏 -
Go sync.Once 卡住时,先从初始化 goroutine 的栈确认阻塞资源,再排除重入、锁闭环和无界外部 I/O;需要重试时使用显式状态或新的拥有者,不要直接清零 Once。199 收藏 -
解释 Go io.CopyN 返回 ErrUnexpectedEOF 的真实来源:普通短源输入通常是 io.EOF,而底层 Reader 已报告结构化数据截断时,CopyN 会保留该错误。文章给出 written、err、ReadFull 和调用方兼容处理的判断方法。199 收藏 -
Go GODEBUG 并不是简单的“一次运行开关”。本文区分临时环境变量、shell 继承、go.mod 的 godebug、//go:debug 和进程启动后的修改边界,帮助你判断配置到底影响谁。199 收藏 -
Go embedding 会把嵌入字段的部分方法提升到外层结构体,但值与指针接收者仍受方法集规则限制。本文用字段路径、同名冲突和接口赋值说明如何正确读取与转换。199 收藏 -
Go 的 QueryRow 不在调用处直接返回查询错误,真正的读取、类型转换和无行判断都要从 Scan 处理。本文用一个单行查询示例说明列映射、sql.ErrNoRows、NULL 字段和 QueryRowContext 的边界。199 收藏 -
Go filepath.Glob 无匹配时不会返回错误,真正需要区分的是空结果、ErrBadPattern 和目录范围问题。本文用可复用代码给出排查与封装方法。199 收藏