Go问答技术文章
-
Go 1.22+ 的 ServeMux 会在注册阶段检查 pattern 是否存在无法排序的重叠;本文用请求集合解释冲突原因,并给出消除重复匹配的排查清单。265 收藏 -
Go ReverseProxy 转发后 Host 变化,通常是 Rewrite 中调用 SetURL 后出站 Host 跟随目标主机所致。本文区分 Request.Host、URL.Host 与 X-Forwarded-Host,并给出保留入站 Host、受控转发和迁移检查方法。189 收藏 -
Go 自定义 Transport 后 HTTP/2 不再生效,常见原因不是服务端突然关闭,而是 Dial、DialContext、DialTLS 或 TLSClientConfig 触发了保守默认。本文给出 ForceAttemptHTTP2、Protocols、ALPN 与连接复用的排查顺序。250 收藏 -
Go TLS 握手出现 ServerName 与证书 SAN 不匹配时,通常是客户端验证的主机名、SNI 发送的名称和证书中的 DNSNames 或 IPAddresses 没有对齐。本文按证据拆开三者关系,给出安全配置和排障边界。374 收藏 -
Go TLS 默认使用主机根集合,显式空 RootCAs 池却不会自动合并系统根。通过客户端构造示例说明追加企业 CA、加载错误、容器证书环境与其他握手失败的区别。349 收藏 -
Go HTTP 客户端没有读取 HTTPS_PROXY 时,按请求 scheme、NO_PROXY、localhost、代理值格式和进程首次读取时机逐项排查,并用可复用的 Transport 收敛配置。301 收藏 -
Go 1.25 的 CrossOriginProtection 可以拦截跨源写请求。本文说明如何用 SetDenyHandler 统一返回 JSON 拒绝响应,并厘清安全方法、Origin、Sec-Fetch-Site 与日志边界。405 收藏 -
Go Transport 请求后连接池立即变空,通常不是连接池失效,而是连接仍在使用、响应体未读完或关闭、Keep-Alive 被禁用、空闲超时过短,或者 Transport 被重复创建。本文按状态、代码和配置边界给出排查顺序。148 收藏 -
连接超时不限制响应体读取。通过有限响应客户端示例区分拨号、响应头和总预算,处理 context 生命周期、读取错误、正文大小与关闭责任,并说明流式请求的不同策略。483 收藏 -
Go testing.T.SkipNow 结束的是当前测试函数的后续语句,不会跳过已经登记的 t.Cleanup。本文拆解 SkipNow、runtime.Goexit、子测试和后台 goroutine 的生命周期边界,给出资源登记与跳过用例复查清单。191 收藏 -
解释 Go runtime/debug.SetMaxStack 的单 goroutine 栈上限、旧值返回、只限制未来增长的语义,并区分堆内存、GC 和线程数治理边界。420 收藏 -
Go time.Time.Truncate 按绝对时间取整,半小时偏移的时区可能仍显示本地 :30。本文用最小示例区分固定时长边界与本地日历边界,并给出保留 Location 的 time.Date 重建方案。215 收藏 -
Go 反射删除 map 元素时,SetMapIndex 的 elem 要传 reflect.Value{};本文说明零 Value、类型可赋值和 nil map 的边界。396 收藏 -
从 sync.Pool.Put 的 nil 快速返回讲清未类型化 nil、typed nil 与 Pool.New 的边界,给出可复用临时对象时的类型断言、状态清理和安全兜底写法。189 收藏 -
Go WebSocket 升级前写响应体,通常会先提交普通 HTTP 状态,后续就无法再完成 101 Switching Protocols。本文按请求检查、http.Hijacker 接管、101 握手和帧通信的生命周期拆开说明,并给出正确的写入顺序。197 收藏