Go问答技术文章
-
Go 请求变慢时,先把主机名解析和拿到 IP 后的连接分别计时,再用 net.Resolver 的 PreferGo 与 Dial 判断解析器路径,避免把 DNS 问题误判成 TCP 或业务代码问题。500 收藏 -
Go Transport 配置看似未生效,需区分旧实例归属、连接复用和配置作用阶段。结合客户端工厂与顺序切换示例,说明不可变配置、响应体排空、闲置连接回收及热更新的失败边界。269 收藏 -
从 Go TLS 握手错误、ServerName、RootCAs 和 MinVersion/MaxVersion 入手,区分证书校验失败与协议版本协商失败,并给出不关闭证书验证的修正方式。128 收藏 -
Go HTTP 连接池出现空闲连接通常是 keep-alive 复用的正常结果。本文从 Response.Body、Transport 复用和三个空闲连接参数入手,给出排查与收紧连接池边界的方法。285 收藏 -
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 收藏