Go问答技术文章
-
Go 流式响应中 ResponseController.Flush 返回错误时,先用 errors.Is 区分 ErrNotSupported 与底层刷新失败,再检查 ResponseWriter 包装层、写入时机和代理缓冲,避免把客户端延迟误判成服务端能力不支持。226 收藏 -
tls.ConnectionState.VerifiedChains 为空不一定代表 TLS 握手失败,它取决于客户端 InsecureSkipVerify、服务端 ClientAuth 和是否使用默认证书校验。本文说明如何区分 PeerCertificates、VerifiedChains 与 VerifyConnection,避免误判证书状态。173 收藏 -
Go 闭包捕获循环变量是否出错,取决于模块版本和变量声明方式。本文用最小示例解释 Go 1.22 的按迭代语义、Go 1.21 的 loopvar 预览方式,并给出兼容旧版本的修正写法。448 收藏 -
Go 方法值 x.M 创建时会保存已经求值的接收者。本文用值接收者和指针接收者对照说明旧快照、旧指针与变量重新赋值的区别,并给出方法表达式和显式闭包的修正选择。197 收藏 -
Go 类型别名保留原类型身份,定义类型则引入新的身份。结合编号类型示例说明直接赋值、显式转换、方法集和业务校验的区别,并分析接口迁移与领域隔离的取舍。437 收藏 -
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 收藏