Go语言技术文章
-
Go math/big.Int 的 Append 方法会把整数按指定进制的文本表示追加到已有 []byte 缓冲区。本文说明缓冲区复用、进制与前缀、负数和 nil 边界,并对比 Bytes 与 FillBytes 的二进制语义。296 收藏 -
Go 的 map 可以在 range 遍历中删除当前键,但删除未到达的键会改变本轮可见结果,新增键则可能出现也可能被跳过。本文用可运行示例拆开这三个边界,并说明并发场景为什么仍然不安全。295 收藏 -
Go 反射中 CanSet 为 false 通常不是 Set 写错,而是 Value 没有可写地址,或字段受未导出规则保护。本文从 ValueOf、Elem 和结构体字段三个现场定位原因,并给出安全修改与检查方法。295 收藏 -
signal.NotifyContext 让操作在收到系统信号时通过 ctx.Done 退出,但取消上下文与停止信号订阅是两件事。理解 stop 的资源释放和默认信号行为,才能写出可重复启动、可测试的优雅退出代码。295 收藏 -
Go 1.27 会让 go.mod 中 go 1.27 及以上的模块在 traceback 首行显示 runtime/pprof goroutine 标签。本文区分标签来源和展示开关,并给出 go.mod、go.work、//go:debug 与 GODEBUG=tracebacklabels=0 的控制边界。295 收藏 -
Go big.Float 比较结果不稳定,通常是精度、舍入模式或类型转换顺序不一致。本文用 Int、Rat 和 Float 的边界示例,说明如何设置二进制精度、检查 Acc,并用 Cmp 完成可靠比较。295 收藏 -
Go 的 net.Dialer 通过 LocalAddr 指定出站连接的本地 IP 和端口,通过 Timeout 限制拨号等待;本文说明 tcp 地址类型匹配、context 截止时间、连接读写 deadline 以及常见绑定失败的排查方法。295 收藏 -
用 Go io.Pipe 把压缩写入端和上传读取端连接起来,理解无内部缓冲带来的自然背压,并处理成功关闭、生产失败和上传失败的资源收口。295 收藏 -
io.Reader 一次 Read 不保证填满缓冲区。本文用固定 8 字节头和变长负载示例,讲清 io.ReadFull 的补齐语义、EOF 与 ErrUnexpectedEOF 的区别、长度上限和网络读超时。295 收藏 -
Go DNS 返回多个 A/AAAA 地址后,真正决定连接落点的是 Resolver 结果、Dialer 回退和连接池复用。本文区分默认 DialContext 与显式地址轮转策略,给出共享超时、失败回退和观测边界。295 收藏 -
maps.Equal 使用 == 比较 map 值,而 IEEE 754 NaN 与包括自身在内的任何 NaN 都不相等,因此两个相同键下都保存 NaN 的 map 也会比较失败。本文给出 EqualFunc 修复值比较的方法,并说明 NaN 键为何必须规避。295 收藏 -
Go sqlmock 默认把预期 SQL 当正则表达式处理,问号和括号会改变匹配语义。本文说明如何用 regexp.QuoteMeta 或 QueryMatcherEqual 修复测试。295 收藏 -
解释 Go defer 参数求值、闭包捕获和 Go 1.22 循环变量语义,给出跨版本固定每轮值的写法。295 收藏 -
Go 的 filepath.ToSlash 只负责把当前系统路径分隔符转换成斜杠,适合生成跨平台资源键、归档条目和 URL 风格路径。本文用一个资源清单场景拆开 ToSlash、Clean、path 与 PathEscape 的边界。295 收藏 -
Go 的 http.Header.Get 只返回同名请求头的第一个值,完整读取应使用 Header.Values。本文结合 Add、Set、Get、Values 的差异,说明大小写规范化、直接 map 访问和返回切片复制的排查边界。295 收藏