Go语言技术文章
-
计算接近零的 e^x-1 时,直接写 math.Exp(x)-1 可能丢失有效数字。本文用一个小型增长率场景说明消减误差,再给出 math.Expm1 的用法、特殊值边界和选择清单。351 收藏 -
Go ticker 不 Stop 是否一定导致资源泄漏,要区分 Go 版本、ticker 引用、后台 goroutine 和业务任务生命周期。本文给出跟随任务退出的写法与排查思路。292 收藏 -
Go time.Parse 解析不带时区的字符串时会按 UTC 解释。本文从现象出发,说明何时使用 ParseInLocation、何时使用 In,并补充 IANA 时区、夏令时和错误处理的边界。329 收藏 -
Golang · Go问答 | 1星期前 | 标准库 · 错误处理 · go · 并发控制 · Go context cause 取消原因 WithCancelCause CancelCauseFunc
Go 1.20 起可以用 context.WithCancelCause 保存具体取消原因,再用 context.Cause 读取;本文区分 ctx.Err 的通用状态与 Cause 的诊断信息,并说明父子 context 的首次取消、nil cause 和超时 cause 边界。125 收藏 -
errors.Join合并错误后,应通过errors.Is匹配目标哨兵。本文用完整清单检查示例演示保留%w包装、合并独立问题和同时提示多个类别,并解释同文案错误、nil、Unwrap与As的边界。175 收藏 -
Go context deadline exceeded 只能说明当前上下文因截止时间结束,不能直接定位来源。本文用 WithTimeoutCause、context.Cause 和 errors.Is 区分本地总预算、上游阶段预算与更上层请求超时。243 收藏 -
sync.Cond.Signal 不会保存没有等待者时发出的通知,真正应该持久化的是 ready、队列长度或关闭状态等共享条件。本文用同一把 Locker 保护条件读写,说明如何用 for 设计不会因 Signal 先到而永久等待的等待协议。310 收藏 -
sync.Once 的回调函数内部再次调用同一个 Once.Do 时不会被当作已完成调用,而是等待当前回调结束,因此会卡在同一把互斥锁上。本文拆解死锁原因并给出不重入的初始化写法。156 收藏 -
RWMutex写入等待需要结合同锁实例、读锁持有范围和采样证据定位。本文提供可控制释放的并发示例,区分等待与持有时间,并解释block/mutex profile、嵌套读锁、锁升级与缩小临界区的注意事项。372 收藏 -
sync.Map.LoadOrStore 只能保证同一个键最终保存一个值,不能阻止传入参数在调用前被多个 goroutine 重复构造。本文用每个键一个 sync.Once 的初始化条目,说明怎样让昂贵初始化只执行一次,并覆盖失败缓存、删除重试与排查边界。207 收藏 -
Go sync.Pool 只适合复用可丢弃的临时对象。本文说明 Get 后如何建立初始状态、Put 前如何清理切片和引用,并用 defer 覆盖错误路径,避免旧数据带入下一次使用。463 收藏 -
Go multipart.Part.FileName 读取的是 Content-Disposition 中的 filename 参数。普通表单字段没有这个参数时返回空字符串,文件分段带空 filename 时也可能为空;如果有文件名,Go 还会用 filepath.Base 处理后再返回。464 收藏 -
Go 的 hash/crc32.ChecksumIEEE 会按 IEEE 多项式对传入的字节序列计算 32 位循环冗余校验。本文说明校验范围、分段读取、结果比较和算法兼容边界,帮助你避免把字段遗漏、结果格式或 CRC32 的用途理解错。277 收藏 -
sync.Cond.Wait 返回只代表当前 goroutine 被唤醒并重新拿到 Locker,不代表共享条件仍然成立。本文从解锁、唤醒、重新加锁三个状态说明为什么必须用 for 循环检查条件,并给出条件读写、Signal 与排障边界。359 收藏 -
Go select 的 case 中无标签 break 只会结束最近的 select,不会自动结束外层 for。本文用控制流示例说明 break、break LOOP、continue 和 return 的目标差异,以及如何安全停止外层轮询。181 收藏