Go语言技术文章
-
Go 的 iter.Pull 可以把 iter.Seq 这种推送式迭代器转换为 next 和 stop 两个主动拉取函数。本文用一个小型筛选场景说明 ok 结束信号、提前停止和 defer stop 的正确边界。500 收藏 -
从Wait提前返回与计数错误切入,说明WaitGroup零计数时Add必须先于Wait的规则,提供启动前登记、独立结果槽位示例,并检查Done配对、值复制和批次复用。278 收藏 -
Go 的 Request.Context 取消只是通知,HTTP Handler 是否退出取决于代码有没有把取消信号传到阻塞点并主动返回。本文按请求、下游调用、goroutine 和响应写入四个边界排查这个问题。317 收藏 -
Go 中无缓冲 channel 的发送必须等接收方出现;如果调用方提前 return,发送 goroutine 就可能永久阻塞。本文用最小示例解释泄漏原因,比较缓冲与取消方案,并给出 goroutineleak/pprof 的排查思路。269 收藏 -
Go slices.All 会把切片转换成按顺序产生索引和值的迭代器,配合 range 就能保留传统遍历的两个变量。本文从返回类型、空切片、提前停止和写回原切片几个边界说明它的使用方式,并比较何时直接 range 更简单。217 收藏 -
sync.Map 不是普通 map 的默认替代品。本文从访问模式、类型安全、复合更新和遍历语义四个角度,说明什么时候适合使用 sync.Map,什么时候应保留 map 配合 Mutex 或 RWMutex。281 收藏 -
Go 的 http.Transport 默认会缓存连接,但连接池并不是无条件复用。每次重新创建 Transport、Response.Body 没有读完并关闭、主动关闭 keep-alive、空闲连接超时、每主机连接上限以及服务端协议设置,都可能让请求重新建连。本文用 httptrace 定位原因,并给出稳定的 Transport 管理方式。237 收藏 -
区分Go HTTP客户端单次请求预算、响应体读取与外层重试总耗时,提供绑定Context并限制读体大小的示例,解释阶段超时、错误记录和资源释放。415 收藏 -
Go json.Unmarshal 遇到 JSON null 时会按目标类型处理:指针字段被设为 nil,普通 string 等非指针字段通常保持原值。本文用结构体示例拆开指针、普通字段和字段缺省的边界,帮助排查接口入参中的 nil 现象。158 收藏 -
Go time.Parse 出现差几个小时,通常不是时间被随机改写,而是输入中的时区信息与解析 API 的默认语义不一致。本文对比数字偏移、时区缩写、ParseInLocation 和 Time.In 的使用边界。411 收藏 -
Go 的 HTTP 请求体是一次性读取流,前置中间件、表单解析或 JSON 解码器读到 EOF 后,后面的 io.ReadAll 就可能得到空结果。本文说明如何定位消费点、缓存原始字节、重置 Request.Body,并处理空请求体、大小限制和提前关闭等边界。228 收藏 -
用日报写入示例说明Go os.File.Sync的职责,区分缓冲写入、Flush、Sync和Close,保留阶段错误并说明批次确认、失败残留及持久化边界。123 收藏 -
Go filepath.FromSlash 适合把配置、归档或协议中的斜杠路径转换为目标操作系统的文件路径。本文说明输入边界、与 ToSlash 和 io/fs 的分工,以及不能替代的清理和安全检查。350 收藏 -
用 Go crypto/rand.Read 为令牌填充固定长度的安全随机字节,解释 32 字节预算、十六进制与 Base64 编码长度、错误边界和上线前应观察的生成指标。110 收藏 -
Go encoding/base64 中,RawURLEncoding 同时使用 URL 安全字母表并省略等号填充。本文对比三种编码器,给出编码、解码和兼容带填充输入的写法,并说明跨语言互操作时的边界。499 收藏