Go问答技术文章
-
Go 泛型调用报“缺少方法”时,问题常常不在约束文字,而在值类型与指针类型的方法集不同。本文用一个可复现的命名接口例子,说明 comparable、指针接收者、隐式取址和编译期断言之间的边界。129 收藏 -
解释 Go 循环中 defer 为什么会让资源和内存峰值随迭代数增长,并用小函数边界改写为每轮及时清理。129 收藏 -
解释 Go gzip.Header.Name 解压后为空的四类原因:源流未写 FNAME、Name 设置过晚、Writer.Reset 清空头部,以及多成员默认只记录首个 Header,并给出正确代码与检查清单。129 收藏 -
crypto.Hash 只是哈希算法标识,Available 检查对应实现是否已链接并注册到当前 Go 二进制。本文用 SHA-256 示例解释 false 的原因、导入方式、New 的 panic 边界和推荐写法。129 收藏 -
Go 1.20 起,普通接口类型可以作为 comparable 约束的类型实参,但接口动态值仍可能因为切片、map 或函数而在比较时 panic。本文区分接口可比较、严格可比较和约束满足规则,并给出泛型函数与 map 键的判断清单。129 收藏 -
解释 Go testing.T.Run 的布尔返回值、子测试失败日志与父测试汇总关系,给出保留案例名称和失败上下文的写法,并说明 t.Parallel 场景为什么不能简单依赖立即返回值。129 收藏 -
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 HTTP Server 的 ReadTimeout、WriteTimeout 和 IdleTimeout 分别约束请求读取、响应写入与 Keep-Alive 等待。本文用可运行配置讲清三者边界,并补充 ReadHeaderTimeout、业务 Context 与流式响应的取舍。128 收藏 -
Go 1.23 的 slices.Chunk 能把切片按固定大小拆成批次,但空切片、n 小于 1、最后一批不足和底层数组共享都容易被误读。本文用批量写入场景说明它的返回边界、内存行为与测试方法。127 收藏 -
Go 服务把租户路径和用户输入拼成下载链接时,url.JoinPath 会清理 ./ 与 ../,却不会替你确认用户是否越过了业务根目录。本文用最小示例拆开 PathEscape、JoinPath 和边界校验的职责。127 收藏 -
strings.SplitAfterSeq 返回惰性序列,适合逐段读取并保留分隔符。本文用一个可运行示例说明遍历时的调用链、空输入边界和与 SplitAfter 的取舍。127 收藏 -
Go replace 只改变模块源码的解析位置,不会绕过 internal 的导入边界。本文用 go.mod、import path 和 go list 说明本地替换、模块改名及公共包迁移的处理方法。127 收藏