Go语言技术文章
-
用 Go 1.22+ 的 net/http ServeMux 集中注册 /api/v1 公共前缀路由,讲清方法模式、动态段、子树斜杠和冲突边界。292 收藏 -
Go 泛型函数调用时,类型推导主要依据实参与形参的匹配关系和类型约束,不能仅凭接收返回值的变量类型反向猜出类型参数。本文用最小代码说明失败原因、可推导边界与显式类型实参的写法。303 收藏 -
Go HTTP 接口接收 JSON 时,应在 json.Decoder 读取前用 http.MaxBytesReader 限制请求体大小,并区分 MaxBytesError、JSON 语法错误、未知字段和尾部多余数据。本文比较不同限制方式,给出可直接改造的 Handler 示例与上线决策表。133 收藏 -
Go 中值类型不能赋给接口,常见原因是接口要求的方法由指针接收者声明,因而只进入 *T 的方法集。本文用最小示例区分方法调用的自动取地址与接口赋值规则,并给出值接收者、指针接收者和编译期断言的判断方法。478 收藏 -
Go 包初始化不会把文件名当成业务顺序协议。本文区分包级变量依赖、同包多文件呈现顺序和 init 调用边界,并给出 go list 排查与显式 Setup 重构方法。261 收藏 -
用 Go channel、固定数量 worker 和 WaitGroup 搭建有界并发工作池,厘清任务投递、队列容量、关闭责任与结果收口,避免无限创建 goroutine 和 send on closed channel。123 收藏 -
Go 1.22 改变了循环变量的每轮作用域,但真正的判断点是 go.mod 的语言版本和变量声明方式。本文用闭包示例说明旧模块、新模块及兼容写法。247 收藏 -
用一个批量读取任务的例子,拆解 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 收藏