Go教程技术文章
-
sync.Once 只保证初始化函数执行一次,不会替你重试或返回错误。本文用共享结果与错误状态封装初始化,让并发调用稳定拿到失败原因,并说明哪些情况应该改用显式重试。419 收藏 -
math/big.Int 的 Add、Mul 等方法会把结果写入接收器。复用同一个 *Int 可能让旧变量和新结果互相覆盖。本文说明指针别名的成因,演示用 new(big.Int).Set 创建独立副本,并给出缓存、序列化、并发和测试边界的处理方式。212 收藏 -
用 big.Int 保存高位数金额,用 big.Rat 计算精确比例,再分别用 Cmp 做阈值比较、用 RatString 保留分数、用 FloatString 生成最终展示值。379 收藏 -
Go 处理跨夏令时的日期范围时,不要把一天硬编码成 24 小时。本文用 time.Location 绑定 IANA 时区,以左闭右开方式构造本地日期边界,并说明 AddDate 与 Duration 的使用区别。485 收藏 -
Go 的 time.Parse 不能用一个 layout 自动吞掉可选时区。本文按日志形状分流:显式时区用 time.Parse,缺少时区用 time.ParseInLocation,并说明如何统一比较与落库。271 收藏 -
用 time.NewTimer 和单 goroutine 事件循环实现可重置的空闲超时,讲清 Reset 前排空、Go 1.23 语义变化,以及 time.After、AfterFunc 的选择边界。219 收藏 -
用 Go 的 time.Ticker 配合 context 和 select 驱动周期任务,讲清慢任务下 tick 的处理、Stop 不关闭 channel 的语义,以及退出时等待 Goroutine 收尾的写法。371 收藏 -
Go encoding/json 会对可编码 map 的键排序,适合在同一编码路径中生成稳定 JSON 字节用于签名测试;跨语言签名还需另行约定数字、转义和规范化规则。322 收藏 -
用 priorityRank 把业务优先级映射成整数,再让 slices.SortFunc 按优先级、时间和 ID 排序结构体切片;同时说明未知优先级、严格弱序、稳定排序和 IsSortedFunc 检查。336 收藏 -
Go 里用 sort.SliceStable 按多个字段排序时,比较器要按优先级逐层比较,所有字段相等则返回 false,稳定性才能保留原始顺序。190 收藏 -
用 bytes.Buffer 解析批量协议时,Reset 可以复用已分配容量,但不会替你维护消息边界。本文用固定长度前缀示例说明读取推进、半包判断、Bytes 切片生命周期和复用检查清单。128 收藏 -
用 strings.Builder 拼接大量片段时,按字节数估算 Grow 容量,按输入类型选择 WriteString、Write、WriteByte 或 WriteRune,并避开 []byte 到 string 的多余转换与非零 Builder 复制。355 收藏 -
高频日志过滤不要在每条日志到来时重新解析正则。本文用一个小型过滤器演示 regexp.Compile 的初始化时机、*regexp.Regexp 的并发复用,以及动态改规则时如何隔离可变配置。447 收藏 -
用 SyntaxError、UnmarshalTypeError 和 Decoder.InputOffset 区分 JSON 错误口径,并把字节偏移、字段路径、原始片段和业务记录写进可检索日志。152 收藏 -
Go 接口遇到同一字段有时返回字符串、有时返回数字时,可以为局部类型实现 UnmarshalJSON。本文用 json.RawMessage 区分输入形态,说明别名类型、null、空字符串与非法值的处理边界。281 收藏