-
Go 子切片不会复制底层数组,长期保存一个很小的窗口也可能让大数组持续可达。本文从 len、cap 和引用关系入手,说明何时必须复制、full slice expression 能解决什么,以及如何避免缓存和结构体字段继续持有旧数组。
-
Go ldflags 注入版本变量失败,应先核对包级字符串声明和完整符号路径,再检查引号、脚本覆盖与实际产物。给出 main.Version 最小示例和包内变量写法,区分链接期赋值与运行时覆盖。
-
Go 程序不要把用户配置目录写死为 $HOME/.config。os.UserConfigDir 会按平台选择配置根目录,但环境变量异常时也会返回错误。本文给出从定位、拼接应用子目录到安全写入配置文件的最小实践。
-
net.LookupTXT 返回的是 TXT 记录组成的字符串切片;单条 TXT 记录内部有多个字符串片段时,Go 会把它们拼成一个字符串。生产代码应使用带超时的 Resolver.LookupTXT,并明确保留记录边界、处理错误和限制日志内容。
-
解释 Go Testify 的 AssertExpectations 为什么只能证明声明的 mock 期望被满足,不能单独证明调用次数完全正确,并用 Once、Times、AssertNumberOfCalls 和参数匹配清单补齐测试约束。
-
Go archive/tar 读取 unexpected EOF 时,关键是区分正常归档结束与条目数据未读满。本文结合 Header.Size、实际读取字节数和 Next 的边界行为,给出定位截断归档的排查写法。
-
Go x/text/search 的 IgnoreCase 不是简单把两边字符串转成小写,而是保留原文并按语言规则完成大小写不敏感匹配。本文从一个小型搜索工具出发,说明它与 ToLower、Loose、Exact 的区别。
-
Go x/text/width 的 Widen 处理半角片假名时,半角浊音符号可能变成组合标记。本文说明宽度映射与 NFC 规范化的区别,并给出原文、展示值和比较键的分层写法。
-
Go debug/dwarf.Reader 按前序顺序读取 DIE,Children 表示后面有子树,Tag 为零表示当前子列表结束,nil 则表示整个 info section 读完。本文用深度计数器和 SkipChildren 讲清遍历写法。
-
go-cmp 比较含未导出字段的结构体时 panic 不是库失效,而是默认拒绝猜测内部字段语义。本文按字段用途选择 IgnoreUnexported、自定义 Comparer 或 AllowUnexported。
-
Go x/text/unicode/bidi 处理的是双向文本的段落与视觉 runs,不是把右向字符串从头到尾反过来。本文用混合文本说明 ReverseString 的边界,并给出 Paragraph.Order 与 Line 的排查写法。
-
Go 中 goroutine 把结果发送到无人接收的 channel 时,发送操作可能永久阻塞。本文用 context 的取消分支修复泄漏,并用固定取消次数、goroutine 增量和资源边界说明何时该用缓冲区、何时必须让底层工作也支持取消。
-
Go go env GOTOOLDIR 返回的是当前宿主工具链目录,不是 GOOS/GOARCH 目标目录。本文用 go env、工具文件检查和最终二进制复查,建立一套核对交叉编译路径的排障流程。
-
Go 的 math.Signbit 判断浮点数符号位,因此能识别负零;x < 0 判断的是数值顺序,负零与零相等所以不会命中。本文用 Copysign、Float64bits 和 NaN 边界说明两种判断的使用场景。
-
Go oggvorbis.Reader.Read 返回的是按声道交错排列的 float32 样本值。本文用双声道示例说明如何按 L0、R0、L1、R1 拆分左右声道,并处理短读、EOF、声道数和完整帧边界。