Go语言技术文章
-
Go 的 nil channel 不会就绪,因此放进 select 的收发分支永远不会被选中。本文用最小示例解释它与未就绪、已关闭通道的区别,并给出初始化、动态禁用和退出处理方案。128 收藏 -
go test 在包列表模式下会复用成功的测试结果,看到 (cached) 时不一定代表测试二进制被重新运行。本文说明 go test -count=1 的适用场景、GODEBUG=gocachetest=1 的排查方法,以及测试缓存和构建缓存的区别。128 收藏 -
Go 泛型函数通常从调用实参建立类型关系,不能只凭接收变量的类型逆向猜出返回值中的类型参数。本文用最小示例解释推断边界,并给出显式实例化、增加输入参数和非泛型包装三种改法。128 收藏 -
Go xml.Decoder 的 Strict=false 不是万能容错开关。本文用缺失结束标签、未知实体、孤立结束标签、命名空间和字符集几个输入,拆开说明哪些问题会被放宽,哪些仍必须修复或显式处理。128 收藏 -
围绕 Go time.Ticker 的 Stop、ticker.C 和停止瞬间的残留 tick,说明如何结束消费循环、避免错误 drain,并给出关闭检查清单。128 收藏 -
使用 bytes.Buffer 分批处理数据时,应先用 Len 判断完整批次,再用 Next 消费固定长度;不足一批的尾部继续留在缓冲区。本文给出同步、异步和收尾写法。128 收藏 -
讲清 Go slog.HandlerOptions ReplaceAttr 的统一字段清洗方案,覆盖敏感字段脱敏、内置键重命名、分组路径判断、删除字段与回归测试。128 收藏 -
Go HTTP Server 的 ReadTimeout、WriteTimeout 和 IdleTimeout 分别约束请求读取、响应写入与 Keep-Alive 等待。本文用可运行配置讲清三者边界,并补充 ReadHeaderTimeout、业务 Context 与流式响应的取舍。128 收藏 -
Go clean -cache 后构建仍像使用旧文件,通常不是缓存没有清干净,而是实际构建输入、模块目录、测试缓存、cgo 外部库或旧二进制路径出了偏差。本文给出一套从 go env、go list 到 -a 和 GODEBUG 的排查顺序。128 收藏 -
从 Go TLS 握手错误、ServerName、RootCAs 和 MinVersion/MaxVersion 入手,区分证书校验失败与协议版本协商失败,并给出不关闭证书验证的修正方式。128 收藏 -
Go 的 debug/pe 将 PE 文件的 OptionalHeader 暴露为 32 位或 64 位具体结构。本文用一个紧凑的类型 switch 读取 AddressOfEntryPoint 与 ImageBase,解释入口点 RVA、虚拟地址和文件偏移的区别,并补上解析失败与不可信输入的处理边界。128 收藏 -
Go 可用 japanese.EUCJP Decoder 将日文历史文件转为 UTF-8。本文给出只读源文件、新建独立副本的流式实现,说明错误清理、替换字符与迁移记录的边界。128 收藏 -
Go 1.23 的 slices.Chunk 能把切片按固定大小拆成批次,但空切片、n 小于 1、最后一批不足和底层数组共享都容易被误读。本文用批量写入场景说明它的返回边界、内存行为与测试方法。127 收藏 -
Go 服务把租户路径和用户输入拼成下载链接时,url.JoinPath 会清理 ./ 与 ../,却不会替你确认用户是否越过了业务根目录。本文用最小示例拆开 PathEscape、JoinPath 和边界校验的职责。127 收藏 -
strings.SplitAfterSeq 返回惰性序列,适合逐段读取并保留分隔符。本文用一个可运行示例说明遍历时的调用链、空输入边界和与 SplitAfter 的取舍。127 收藏