Go教程技术文章
-
用 Go 1.22+ 的 net/http ServeMux 集中注册 /api/v1 公共前缀路由,讲清方法模式、动态段、子树斜杠和冲突边界。292 收藏 -
Go HTTP 接口接收 JSON 时,应在 json.Decoder 读取前用 http.MaxBytesReader 限制请求体大小,并区分 MaxBytesError、JSON 语法错误、未知字段和尾部多余数据。本文比较不同限制方式,给出可直接改造的 Handler 示例与上线决策表。133 收藏 -
用 Go channel、固定数量 worker 和 WaitGroup 搭建有界并发工作池,厘清任务投递、队列容量、关闭责任与结果收口,避免无限创建 goroutine 和 send on closed channel。123 收藏 -
用一个批量读取任务的例子,拆解 errgroup.WithContext、首个错误取消和 Wait 收尾之间的关系,并说明为什么子任务必须主动消费 ctx.Done。381 收藏 -
用 Go atomic.Uint64 实现并发计数,说明 Add、Load、Store 和 CompareAndSwap 的边界,并区分单个计数值与多字段一致快照。110 收藏 -
sync.Pool 适合复用可丢弃的临时缓冲区,而不是业务状态或必须长期保留的资源。本文用 bytes.Buffer 和 []byte 说明 Reset、归还时机、异常容量清理与收益判断。462 收藏 -
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 收藏