Go语言技术文章
-
url.ParseQuery 返回错误时,Values 仍然包含已经成功解码的合法参数。本文用一个混合合法与非法编码的查询串,说明如何识别部分成功、如何在保留参数和拒绝请求之间做出明确选择。458 收藏 -
Go 内置 DNS 解析器执行 A+AAAA 或搜索域子查询时,StrictErrors 决定临时错误是允许返回部分地址,还是中止整体查询。本文说明其作用范围、宽松与严格代码写法、DNSError 分类和兼容性取舍。457 收藏 -
Go database/sql 读取多个 SQL 结果集时,要在每组内部用 Rows.Next 遍历行,当前组结束后用 NextResultSet 切换,并在每次切换后重新调用 Next;本文给出两层循环、空结果集和错误处理写法。456 收藏 -
使用 sync.WaitGroup 收尾并发任务时,关键不是把 Wait 放在最后,而是保证任务计数先建立、空 WaitGroup 上的 Go 先于 Wait,并在复用前等上一轮 Wait 返回。本文对比 WaitGroup.Go 与 Add/Done 的调用顺序,给出一份可直接落地的并发收尾写法。455 收藏 -
项目同时维护 mock、stringer 和资源生成指令时,go generate -run 可以按指令完整原文的正则匹配只执行目标任务。本文从一次误触发现场讲清匹配范围、精确写法、预览排查和防复发约定。453 收藏 -
Golang · Go问答 | 1小时前 | 错误处理 · Go问答 · 流式解码 io.Reader CorruptInputError io.ErrUnexpectedEOF Go base64 base64.NewDecoder
base64.NewDecoder 是流式读取器,遇到截断输入时可能先返回已经完整解出的字节,再在后续读取中报告 io.ErrUnexpectedEOF。本文拆解 4 字符分组、n 与 err 的关系,以及如何避免把部分数据误当成完整结果。453 收藏 -
Go 处理不可信图片时,先用 image.DecodeConfig 读取格式配置和宽高,再按 int64 像素预算决定是否进入 image.Decode,避免不必要的完整像素分配。451 收藏 -
bytes.Reader.WriteTo 会消费当前未读区间,完整导出后 Len 变为 0。本文解释读取索引为什么推进,并给出复用 Reader、重读原始字节和随机读取时的安全写法。450 收藏 -
Golang · Go问答 | 1小时前 | 错误处理 · IO · Go问答 · 字节偏移 io.Seeker Go strings.Reader Reader.Seek ErrInvalidWhence
strings.Reader.Seek 的 whence 不是任意整数,只能使用 io.SeekStart、io.SeekCurrent 或 io.SeekEnd。本文用字节偏移示例区分 ErrInvalidWhence、负位置和超过末尾三种情况。449 收藏 -
Go net/http 中,响应 Trailer 不是普通响应头,服务端要在写出响应前声明尾部字段,客户端还要先把 Response.Body 读到 EOF 才能读取最终 Trailer。本文解释声明顺序、读取时机与为空排查方法。448 收藏 -
结构体里放入 sync.Mutex 后,按值传参、赋值或返回都会复制锁的内部状态,可能造成异常解锁、数据竞争和锁失去保护对象。本文从根因、错误写法、指针改造和 go vet copylocks 检查四个方面说明安全设计方式。448 收藏 -
使用 os/exec 启动子进程时,Cmd.Env 不是局部补丁而是环境集合。本文说明如何先设置 Cmd.Dir,再用 Cmd.Environ 获取当前配置下的完整环境,并安全追加变量,同时解释 Unix 下 PWD 的变化与跨平台边界。446 收藏 -
time.Timer.Reset 返回 false 不代表重置失败,它表示定时器在调用前已经到期或停止。本文按活动、到期、停止三种状态,说明 Go 1.23 及以上与旧版本的重新安排写法。446 收藏 -
maps.All 返回绑定原映射的惰性迭代器,并不会在创建时复制数据。本文从修改时点、迭代中变更和并发边界说明真实语义,并给出 maps.Clone 与有序快照写法。445 收藏 -
Go 包迁移时,type A = B 只增加一个兼容名称,不会创建新类型,因此 reflect.Type 的 Name 和 PkgPath 仍然对应原定义类型。本文用一个小项目区分类型别名与类型定义,并给出以 reflect.Type 身份比较替代字符串判断的兼容方案。444 收藏