Go语言技术文章
-
Go 服务端可以在 ClientHelloInfo.SupportedVersions 中读取客户端声明支持的 TLS 版本,但它不是最终协商结果。本文说明回调读取、TLS 1.2 以下版本的推导边界、服务端 MinVersion/MaxVersion 的交集判断,以及握手完成后用 ConnectionState.Version 确认最终版本。475 收藏 -
从字段缺失、零字节文件、读取游标和写入失败区分Go multipart上传为空的原因,给出FormData最小提交和本机临时落盘诊断代码,比较解析大小与复制字节数。475 收藏 -
Go go toolchain 配置没有生效时,先检查当前目录、GOTOOLCHAIN 来源以及 go.mod、go.work 的 go/toolchain 行,再按优先级清理覆盖配置。本文给出一套从现象到最小确认的排查顺序。475 收藏 -
bytes.NewBuffer 会把传入的 []byte 作为初始缓冲区内容使用,不会替调用方自动复制。本文说明原切片修改为何会影响后续读取,以及如何用 bytes.Clone 或显式复制隔离数据。472 收藏 -
Go runtime/metrics.Read 可以复用同一个 []metrics.Sample,但要区分串行采样、并发底层内存和直方图深拷贝边界。本文给出可落地的定时采样写法。472 收藏 -
Go os.Lstat 的结果通常并不是随机变化,而是读取对象、错误分支或并发替换窗口没有分清。本文用快照、ModeSymlink 和 PathError 说明排查顺序,并给出稳定观察文件状态的写法。472 收藏 -
Go http.Cookie 的 RawExpires 只保存读取到的原始 Expires 文本,Expires 才是可用于时间判断和重新序列化的 time.Time。本文说明两者的关系、解析失败边界以及如何在代理和审计代码中正确使用。470 收藏 -
解释 Go errors.As 为什么常见写法是传入目标变量的地址,区分 *MyError、**MyError、接口目标、panic 与 false,并给出错误包装和自定义 As 的排查方法。469 收藏 -
Go url.URL.JoinPath 用于按 URL 语义组合路径段,会处理多余斜杠和点段,但不负责查询参数、文件路径或权限校验。本文结合代码说明 Path、RawPath、EscapedPath 与 RawQuery 的边界,帮助你安全地拼接 HTTP URL。468 收藏 -
encoding/json v1 解码到结构体时会优先精确匹配,也接受大小写不敏感的字段匹配,因此 JSON 键大小写不同仍可能填充结构体字段。本文解释标签、map、DisallowUnknownFields 与严格键名预检的边界,并说明 v2 的差异。467 收藏 -
Go context 取消后下游查询仍在继续,通常不是取消函数失效,而是信号没有传到查询 API,或数据库驱动没有实现可取消路径。本文用 QueryContext、rows 生命周期和驱动边界逐层排查。467 收藏 -
Go 的 io/fs.ValidPath 只接受不带根的斜杠路径。本文用 os.DirFS 建立受限根目录,先校验文件名再用 fs.ReadFile 读取,并说明 ..、符号链接、权限和运行身份的边界。467 收藏 -
Go time.Duration.Round 会把时间间隔舍入到指定粒度的最近倍数,刚好过半时远离零点,非正粒度则原样返回。本文用紧凑示例说明它与 Truncate 的区别、字符串和毫秒输入的统一处理,以及定时器参数的边界。466 收藏 -
Go 的 float64 可以作为 map key,但 NaN 不等于自身,所以写入后的 NaN 不能按原值稳定查回。本文解释插入、查找、删除的边界,并给出规范化键的写法。465 收藏 -
atomic 只保证参与原子操作的那次访问,不会自动把同一变量旁边的普通读写变成安全访问。本文解释混用产生数据竞争的原因,并给出统一 atomic 或改用 Mutex 的写法。465 收藏