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 收藏 -
反复调用 regexp.MatchString 时,包级函数会把正则编译带进热路径。本文拆开调用链,给出固定模式与动态模式两种缓存设计,并处理并发、编译失败和容量边界。364 收藏 -
Go http.Server 的 MaxHeaderBytes 只限制解析请求行和请求头的读取范围,不限制请求体。本文从自定义 Server 是否生效、前置代理边界和 MaxBytesReader 三个层面说明为什么看起来仍能收到大请求。364 收藏 -
Go IPv6 优先连接等待需区分 DNS、双栈回退和请求后续阶段。通过 httptrace 记录连接事件,理解 FallbackDelay 与总拨号预算,并避免把强制 tcp4 当永久修复。364 收藏 -
Go 1.24 的 strings.SplitSeq 返回一次性迭代器,适合只需逐项处理而不必保留整个字符串切片的场景。本文用大文本解析示例说明它与 strings.Split 的语义差异、空字段边界、内存取舍和兼容写法。363 收藏 -
Go 1.23 的 slices.Chunk 会把每个分组容量裁到长度。本文从三索引切片、底层数组共享和 append 扩容讲清设计原因,并给出修改、追加、异步留存与 Clone 的工程决策边界。363 收藏 -
GopherLua 的 CallByParam 通过 Protect 在 PCall 与 Call 之间选择:保护调用把脚本运行错误变成 error,普通调用则让错误 panic。本文对照 Fn、NRet、Handler 和异常边界,说明两种写法该怎样选。363 收藏 -
Go 解包符号链接越界不能只靠路径字符串检查。本文说明链接拒绝策略、私有输出目录与 os.Root 写入边界,并提供仅接受目录和普通文件的 tar 示例。363 收藏