Go语言技术文章
-
用 os.UserConfigDir 获取跨平台的用户配置根目录,再追加应用子目录和文件名;本文解释 Unix、Darwin、Windows、Plan 9 的目录规则,以及环境变量缺失时如何显式处理错误。219 收藏 -
Go 的 replace 可以替换间接依赖,但它只改变主模块依赖图中的模块内容来源;是否进入图仍由 require 和模块图决定。本文用 MVS、go mod graph 与 go list -m all 给出判断方法。208 收藏 -
围绕 time.Ticker 的动态改周期、永久停止和停止后复用,讲清 Reset、Stop 与 C 通道之间的调用顺序,避免重复创建和并发竞态。208 收藏 -
ServeMux 的匹配不是简单比较路径字符串,而是综合方法、主机和路径,并按请求集合的具体程度选择模式。本文用请求生命周期拆解通配符、优先级、405、尾斜杠和 Go 1.22 兼容边界。207 收藏 -
atomic.Pointer 能让配置指针的替换具备原子性和同步关系,但不会让发布后的配置对象字段可以随意原地修改。本文用不可变快照、单次 Load、race 检查和回滚路径说明原子指针的可见性边界。204 收藏 -
Go 程序直接使用 net.LookupIP 的第一个结果时,IPv4/IPv6 顺序变化可能造成连接变慢或失败。本文区分解析结果、RFC 6724 地址排序和 Dialer Fast Fallback,给出双栈排查、限族连接与安全回归写法。203 收藏 -
Go runtime/metrics 的 Value 不能一律按 uint64 读取,应先依据 Description.Kind 选择 Uint64、Float64 或 Float64Histogram;本文整理 KindBad、未知类型和稳定读取流程。203 收藏 -
用一个实现 io.Reader 的限速包装器接入 io.Copy,让文件或请求体的复制链路按字节速率发送,文章同时说明读取粒度、突发流量、错误处理和并发复用边界。200 收藏 -
Go token.File.SetLines 返回 false,通常不是 API 随机失败,而是行首偏移没有满足严格递增、范围小于文件长度等约束。本文用一组可定位的判断方法说明如何构造行偏移表,并把它接回 Pos、Line、Offset 与 Position 查询。200 收藏 -
Go 用 url.JoinPath 拼接动态资源路径时,先区分单个路径段和多级路径,再用 PathEscape 处理动态值,避免斜杠、空格和路径清理行为带来编码错误。199 收藏 -
Go 的 URL 查询参数同时存在原始字符串和解码后的值。本文用 net/url 拆开 RawQuery、Query 与 ParseQuery 的差异,处理重复键、加号、分号和异常百分号,并给出适合签名、缓存、审计和业务筛选的选择方式。198 收藏 -
Go 1.22 起可以用 reflect.TypeFor[T]() 直接取得泛型参数的 reflect.Type。本文从 TypeOf 的旧写法切入,说明接口、指针、切片和结构体元数据的读取方式,并给出泛型元数据缓存与静态类型边界的实用写法。196 收藏 -
Go os.Pipe 的读端提前关闭后,写端继续写入可能得到 broken pipe。本文从两端关系、关闭时机、错误分类和子进程通信场景说明原因,并给出可复用的处理策略。196 收藏 -
在反射构造切片时,reflect.Value.Grow 可以提前保证追加空间,但它只接受可设置的 Slice Value,不改变切片长度。本文从批量映射场景出发,梳理 Grow 与 append、SetLen 的职责,以及 Kind、CanSet、负数参数和容量溢出的 panic 边界。196 收藏 -
Go 服务不必在每次请求中重复调用 time.LoadLocation。本文用 sync.Once 缓存可共享的 *time.Location,并说明 IANA 时区、UTC、Local、错误处理以及并发首次初始化的边界。195 收藏