Go问答技术文章
-
Go 的 slog.LevelVar 适合把日志级别做成可热更新的开关。本文从 Handler 如何读取级别讲起,给出并发修改、配置回滚和测试验证的最小写法。364 收藏 -
Go 用 IP 连接 HTTPS 时,TCP 地址、TLS ServerName、SNI 和证书 SAN 不是同一个概念。本文解释证书域名不匹配的原因,并给出保留校验的安全写法。364 收藏 -
解释 Go nil slice 与空但非 nil 的 slice 为什么在传统 encoding/json 中分别输出 null 和 [],并说明 omitempty、响应 DTO 归一化以及 encoding/json/v2 迁移时的边界。364 收藏 -
Go pprof profile 为空时,先区分采样窗口、目标负载、阻塞与互斥采样开关,以及 StopCPUProfile 和 Writer 写入边界,再选择正确的修复动作。364 收藏 -
Go 类型推断会从泛型函数的普通实参、赋值上下文和类型约束中补全类型参数。本文用命名切片、无类型常量和部分显式参数说明推断路径,并整理泛型类型不能省略参数的边界。364 收藏 -
Go net.Dialer 的 Timeout 是相对拨号开始的最长时长,Deadline 是绝对截止时刻;二者和 Context 截止时间取最早值。本文用可复用的 DialContext 示例说明设置方式、多地址解析和超时判断。364 收藏 -
从路径段与查询参数的组件边界出发,解释 Go net/url 中加号、空格、PathEscape、QueryEscape 以及两组 Unescape 的差异,并给出避免二次编码的排查清单。364 收藏 -
errors.Unwrap 只调用 Unwrap() error,因此不会拆开 errors.Join 产生的 Unwrap() []error。本文说明单链与错误树的区别,以及 Is、As 和显式枚举的正确用法。364 收藏 -
Go 1.24 的 strings.SplitSeq 返回一次性迭代器,适合只需逐项处理而不必保留整个字符串切片的场景。本文用大文本解析示例说明它与 strings.Split 的语义差异、空字段边界、内存取舍和兼容写法。363 收藏 -
解释 Go runtime.SetFinalizer 为什么不是可靠的资源释放器,结合对象可达性、GC 时机、终结器链和 Close 设计给出可验证的使用边界。362 收藏 -
Go 的 http.Client 遇到 3xx 响应时会自动跟随重定向,但 CheckRedirect 的返回值、请求头继承和错误处理很容易让调用方误以为请求丢了。本文从一个重定向异常场景出发,分层检查 req.URL、Header 和 ErrUseLastResponse,并给出可验收的修复写法。362 收藏 -
Go 1.27 允许结构体字面量直接使用嵌入结构体提升字段作为键。本文用 Gopher 和 Habitat 示例说明字段选择器规则、与旧写法的兼容边界,以及如何用 go.mod 和 go test 做编译检查。362 收藏 -
Go channel 关闭后接收仍会得到元素类型的零值,不能只看 v 判断结束。本文用 comma-ok 区分有效零值、关闭空 channel 和 nil channel,并说明缓冲 channel 的正确消费方式。361 收藏 -
Go 的 encoding/xml 没有 xmlattr 关键字,XML 属性应使用 xml:"name,attr" 映射到导出字段。本文说明属性读取、嵌套元素、写回 XML、未知属性接收和常见空值排查方法。361 收藏 -
Go regexp 中点号默认不匹配换行。本文用最小示例说明 (?s)、(?s:...)、显式字符类和非贪婪量词的选择,帮助控制跨行范围并避免多条记录被一次吞并。361 收藏