Go语言技术文章
-
用一个批量读取任务的例子,拆解 errgroup.WithContext、首个错误取消和 Wait 收尾之间的关系,并说明为什么子任务必须主动消费 ctx.Done。381 收藏 -
Go 中 := 只有在同一块作用域且至少有一个新变量时才会复用旧 err。进入 if 等内层块后,同名 err 可能变成新变量,导致错误检查和返回值失真。396 收藏 -
用 Go atomic.Uint64 实现并发计数,说明 Add、Load、Store 和 CompareAndSwap 的边界,并区分单个计数值与多字段一致快照。110 收藏 -
Go 的 defer 可能在函数真正返回前修改命名返回值。本文用错误包装场景拆开 return 与 defer 的执行顺序,并给出显式返回、只读观测和测试检查的实用写法。155 收藏 -
sync.Pool 适合复用可丢弃的临时缓冲区,而不是业务状态或必须长期保留的资源。本文用 bytes.Buffer 和 []byte 说明 Reset、归还时机、异常容量清理与收益判断。462 收藏 -
sync.Once 只保证初始化函数执行一次,不会替你重试或返回错误。本文用共享结果与错误状态封装初始化,让并发调用稳定拿到失败原因,并说明哪些情况应该改用显式重试。419 收藏 -
Go defer 并不是把整次函数调用推迟到退出时才计算。普通调用会在 defer 登记时保存函数值和参数,匿名函数则通常在真正执行时读取闭包变量。掌握这个差异,就能解释 defer 打印旧值、闭包读到新值等常见现象。177 收藏 -
Go 的 panic 沿当前 goroutine 调用栈展开,recover 只有在同一 goroutine 的 deferred 函数中直接调用才会生效。本文用原创示例说明错误位置、保护函数和 channel 传递边界。434 收藏 -
math/big.Int 的 Add、Mul 等方法会把结果写入接收器。复用同一个 *Int 可能让旧变量和新结果互相覆盖。本文说明指针别名的成因,演示用 new(big.Int).Set 创建独立副本,并给出缓存、序列化、并发和测试边界的处理方式。212 收藏 -
fmt.Errorf 用 %v 和 %w 生成的错误文本可以一样,但 %v 会切断错误链,让 errors.Is 和 errors.As 无法继续判断底层错误。本文用一个原创示例说明两者差异,并给出是否公开底层错误的取舍规则。407 收藏 -
用 big.Int 保存高位数金额,用 big.Rat 计算精确比例,再分别用 Cmp 做阈值比较、用 RatString 保留分数、用 FloatString 生成最终展示值。379 收藏 -
errors.Is 匹配不到自定义包装错误,通常不是错误文本的问题,而是 %w 包装链、Unwrap 关系、自定义 Is 方法集或值指针形态出了偏差。本文用对照代码和测试拆开三类失败。283 收藏 -
Go 处理跨夏令时的日期范围时,不要把一天硬编码成 24 小时。本文用 time.Location 绑定 IANA 时区,以左闭右开方式构造本地日期边界,并说明 AddDate 与 Duration 的使用区别。485 收藏 -
Go 的 time.Parse 不使用 yyyy-MM-dd 这类占位符,而是用 2006-01-02 这组参考时间。本文从最小修复、错误判断、时区和格式化几个方面说明如何排查日期解析失败。233 收藏 -
Go 的 time.Parse 不能用一个 layout 自动吞掉可选时区。本文按日志形状分流:显式时区用 time.Parse,缺少时区用 time.ParseInLocation,并说明如何统一比较与落库。271 收藏