Go语言技术文章
-
Go 中 channel 无人关闭不一定等于内存泄漏,但 range 接收、发送阻塞和提前退出都会让 goroutine 长期存活。本文用 goroutine 栈定位阻塞点,并给出 ctx.Done、发送方关闭和复查清单。345 收藏 -
Go channel 的关闭责任应交给决定“不再发送”的生产者:单生产者完成发送后直接关闭,多生产者等待全部退出后由协调者只关闭一次。本文结合 context、WaitGroup 和 range,说明如何避免重复关闭、向已关闭 channel 发送以及 goroutine 泄漏。288 收藏 -
Go 的 nil map 可以读取、计算长度和遍历,但不能直接写入。本文用一个小型索引示例拆开遍历、初始化和写入边界,说明 make 应该放在哪里,以及空输入时怎样保持行为一致。321 收藏 -
Go 反向代理中,URL.Host 决定连接哪个上游,Request.Host 决定发送哪个 Host 头。本文说明服务端读取、客户端转发、端口和安全校验的边界。392 收藏 -
Go map 的 range 顺序未指定,不能直接依赖遍历结果。本文用一个小型标准库示例收集 key、排序后回查 map,并说明按 value 排序时如何用 key 处理相同值,覆盖 nil map 与并发边界。185 收藏 -
Go 切片的 append 是否改写原数据取决于容量和底层数组共享关系。本文结合 slices.Clone 说明如何建立独立写入副本,以及浅复制、nil 和空切片的边界。136 收藏 -
判断 Go append 是否更换底层数组,先比较追加量与剩余容量,再在非空、相同起点的整数切片中观察元素地址和修改影响。文中给出容量充足与不足的对照示例,并区分限制容量与复制。346 收藏 -
Go bytes.Buffer Grow 会预留后续写入所需的容量,但不会直接增加 Len。本文用已知长度和未知长度两种场景说明如何减少重复扩容,并梳理负数、过大参数、Reset 复用与并发访问边界。246 收藏 -
Go 接口中的 nil 指针不一定等于 nil 接口。本文用最小代码对比 typed nil 的成因,并给出 error 返回、调用方检查、errors.Is 与 errors.As 的安全处理清单。316 收藏 -
Go 接口里放入 typed nil 指针后,接口本身可能不等于 nil;comma-ok 断言成功也不代表结果指针可用。本文用 T/V 两层模型和边界封装说明如何排查与处理。416 收藏 -
Go net.Pipe 没有内部缓冲,读写可能一直等待对端动作。本文说明怎样设置 deadline,并用 errors.Is、net.Error 和关闭错误区分超时、对端关闭与其它网络错误。294 收藏 -
Go 错误被 fmt.Errorf 包装后,直接类型断言可能失效。本文用自定义错误演示 errors.As 如何沿错误树取出目标类型,并区分 As、Is 与 errors.Join 的适用边界。261 收藏 -
Go 错误经过多层 %w 包装后,不能再依赖 == 或完整错误文本判断原因。本文用 errors.Is 处理多层 Unwrap,区分 errors.Unwrap 的单层职责,并说明错误分类与上下文包装的边界。204 收藏 -
Go net/url 解析 https://example.com/items? 时,RawQuery 为空并不代表原始 URL 没有问号。本文用 URL.ForceQuery 区分没有查询、空查询和带参数查询,给出解析、修改和输出请求 URI 的最小配方。231 收藏 -
Go HTTP 服务端用 MaxBytesReader 限制请求体后,应该通过 errors.As 区分正常读取、超过上限和其它读取错误。本文给出带 Close 的 handler 写法,并说明大小限制与业务校验的边界。318 收藏