Go问答技术文章
-
Go 泛型里的类型参数不是运行时接口值,直接写 v.(string) 会失败。本文用最小复现解释类型约束、动态类型和 any(v).(T) 的区别,并给出安全的类型分支写法。191 收藏 -
Go 1.22 起可以直接用 http.FileServerFS 接收 fs.FS。本文用 embed.FS 和 fs.Sub 说明嵌入目录、URL 路径、io.Seeker 要求、404 与 index.html 重定向之间的关系。298 收藏 -
Go GC 变频繁并不一定意味着存活堆持续增长,常见原因是分配速率上升、GOGC 目标变小或内存上限触发更积极的回收。本文用 runtime/metrics 和 pprof alloc_space 区分现象,再给出修正顺序。172 收藏 -
从 goroutine 数量趋势、pprof 堆栈和 goroutineleak profile 入手,区分 channel 阻塞、I/O 等待与活跃循环三类增长,并给出可回滚的修正步骤。370 收藏 -
Go pprof heap 看不出对象来源,应先区分分配调用栈和引用持有关系。结合离线分析命令,说明构建与源码匹配、存活和累计分配指标、采样边界及清理前后应观察的业务数据。206 收藏 -
Go race 报告标出 Read by goroutine 时,不要只盯着读函数。本文用一段最小复现说明如何沿 Previous write 栈找到真正写入点,再把互斥锁、通道或原子操作补在共享状态边界。385 收藏 -
围绕 Go 1.25 的 testing.T.Attr,说明测试属性的键值约束、无序日志语义、go test -json 的 attr 事件字段,以及旧版本和 CI 解析器的兼容处理。126 收藏 -
Go benchmark 每次运行数字不同,通常不是 testing.B 失效,而是被测代码、计时边界和机器环境共同产生了噪声。本文用最小基准说明波动来源,并给出可比较的运行方式。218 收藏 -
Go 测试本机通过而 CI 失败,通常是工具链、模块目录、构建条件或运行资源不同。本文用环境摘要、关闭缓存、结构化日志和测试门禁,把模糊失败变成可复现、可对比的问题。279 收藏 -
解释 os.DirFS 与 fs.ValidPath 只能约束 fs 路径语法,为什么仍挡不住根目录中的符号链接或相对根目录变化,并给出使用 os.Root 的迁移方式。342 收藏 -
filepath.Join 会清理路径文本,但不会替应用保证结果仍在指定根目录内。本文用最小示例说明 Join、IsLocal 与 os.OpenInRoot 的边界,并给出四类输入的验证矩阵。372 收藏 -
os.Stat 成功不保证后续 Open 成功。文章说明路径竞态、权限差异与文件句柄的区别,给出直接打开、限量读取和错误分类示例,并划清排他创建与可信根目录访问的边界。369 收藏 -
Go 的 io.Reader 允许在最后一批数据返回 n > 0 与 io.EOF,若代码忽略 n、处理空缓冲区或把整个 buf 当成有效数据,就会出现末尾多处理一次。本文用最小示例说明原因,并给出按 n 与 err 分开处理的可靠写法。300 收藏 -
Go 的 url.URL.String 可以保留 # 后的 Fragment,但 RequestURI 只生成 HTTP 请求需要的路径与查询部分,因此看起来像是 Fragment 丢失。本文用最小示例说明两者的边界,并给出需要把片段信息传给服务端时的改造方式。216 收藏 -
Go 的 encoding/csv 负责解析记录和字段,不会自动识别 GBK 或 GB18030。本文从 UTF-8、GBK 解码边界出发,说明中文 CSV 出现乱码的原因与可直接复用的修正写法。126 收藏