Go语言技术文章
-
sync.Map.LoadAndDelete 同时完成读取和删除,真正判断键是否存在要看 loaded,而不能只看 value 是否为 nil。本文用一个可运行的小场景拆开返回值、并发语义和常见误判。133 收藏 -
本文说明如何用带缓冲 channel 作为槽位池限制 Go 并发任务数,覆盖容量语义、槽位获取与释放、context 取消、WaitGroup 收尾,以及信号量和固定 worker 的选择边界。374 收藏 -
Go Background 本身不保存请求值。本文区分派生上下文复用、共享可变对象和取消关系,提供每请求独立关联号中间件,并说明私有键、WithoutCancel 与后台任务的数据边界。442 收藏 -
Go 使用 context.WithCancel 后 goroutine 仍不退出,通常是 worker 没有监听 ctx.Done 或底层调用不可取消。本文按取消传播、worker 改写和依赖调用三个层次说明排查与修复边界。306 收藏 -
Go 的 os.Rename 跨文件系统失败通常对应 Unix-like 系统的 EXDEV。本文从 LinkError 和挂载边界入手,说明何时继续使用 Rename,以及如何用复制、落盘、目标切换和源文件清理实现可恢复的跨文件系统移动。301 收藏 -
Go TempFile 创建成功不代表清理必然成功。本文说明句柄关闭、路径删除和资源归属的区别,给出保留业务与清理错误的函数,并讨论 Windows 占用、延迟清理及用户状态反馈。301 收藏 -
Go 的 os.ReadDir 会一次性返回目录条目,大目录容易让内存峰值随规模增长。本文用 File.ReadDir 分批处理、按需读取元数据和排序边界说明一套可回滚的排障方案。277 收藏 -
Go database/sql 事务提交后 Rows 仍未关闭,通常与提前退出、未检查 Rows.Err 或把 Commit 当成 Close 有关。本文给出提交前显式关闭结果集、错误回滚和连接池排查方法。312 收藏 -
Go database/sql 的 WaitCount 持续增加,不一定代表连接池正在持续恶化,因为它是累计等待次数。本文用 WaitDuration、OpenConnections、InUse 和 Idle 的时间差判断真实争用,再从连接上限、查询占用和资源归还三个方向选择修复方案。238 收藏 -
Go 使用 encoding/json 解码时,JSON null 会把指针设为 nil,而字段缺失可能保留结构体原值。本文拆开 null、缺失、非 null 和三态字段建模的边界。501 收藏 -
Golang · Go问答 | 4天前 | 标准库 · 类型转换 · Go问答 · JSON Go encoding/json UseNumber Decoder json.Number UnmarshalTypeError
Go JSON 使用 Decoder.UseNumber 后,转换失败通常不是 UseNumber 失效,而是 json.Number 与目标字段语义不匹配。本文从原始字面量、Int64/Float64 转换和 UnmarshalTypeError 字段路径入手,定位格式、范围与协议问题。484 收藏 -
Go 用 JSONDecoder 连续读取多个对象时,常见问题不是 Decode 自动串数据,而是输入边界、数组边界和内部预读被混在了一起。本文给出连续 Decode、io.EOF、InputOffset 和 Buffered 的迁移边界。184 收藏 -
netip.ParseAddrPort 不会为缺端口输入自动补值。本文将显式IP端点与裸IP分开,提供业务默认端口封装,保留空端口、越界端口和域名错误,并解释IPv6歧义、零端口及配置迁移边界。374 收藏 -
Go netip.Prefix.Contains 返回结果异常时,先检查地址族、映射地址、零值和 IPv6 zone,再确认 Prefix 是否有效以及是否需要 Masked 规范化。333 收藏 -
Go netip 中的普通 IPv4 和 IPv4-mapped IPv6 虽然指向同一 IPv4 数值,Addr 表示仍不同,因此直接比较或作为 map 键可能不相等。本文用 Is4In6、BitLen 和 Unmap 定位原因,并给出规范化键的边界。371 收藏