Go问答技术文章
-
sql.Conn.Raw 能让 Go 程序临时访问驱动连接,但回调结束后 database/sql 只根据返回错误判断连接是否还能用。本文解释修改驱动状态后的复用风险,以及何时应返回 driver.ErrBadConn。334 收藏 -
cgo 返回的 C 指针并非一律不能保存到 Go。本文区分 Go pointer 与 C pointer,说明 unsafe.Pointer 的持有边界、C.free 释放责任,以及 cgocheck 报错的排查方法。334 收藏 -
Go archive/zip 的 Writer.Copy 用于原始条目复制,不负责重建文件头。本文解释 Copy、CreateRaw 与 CreateHeader 的边界,并给出修改 ZIP 元数据和重新压缩内容的实现方式。334 收藏 -
复盘 Go TLS 会话恢复仍走完整握手的常见根因,重点检查客户端缓存、TLS 1.3 会话票据读取、缓存键与多实例票据密钥。334 收藏 -
Go atomic.Value.Swap 会把新值写入原子容器并返回替换前的值;首次调用返回 nil,但新值不能为 nil,后续调用还必须保持同一具体类型。本文用配置快照场景说明如何安全接住旧值并处理边界。334 收藏 -
io.LimitReader 读到上限后返回 EOF 是设计出来的正常结束信号,不是超限报错。本文从 Reader 契约出发,说明如何用 limit+1 的策略识别输入是否真的超过上限,并比较 LimitReader、ReadFull 与 ReadAtLeast 的适用边界。334 收藏 -
Go 的 encoding/json 解码到 *T 时,字段缺省和显式 null 都可能得到 nil,单靠指针无法区分。本文用 RawMessage 和泛型 Optional 保存字段是否出现、是否为 null 以及实际值,帮助接口更新和默认值处理避免语义丢失。334 收藏 -
gojq 能保持大整数精度并进行任意精度整数计算;如果先转成 float64,超过 2^53 的整数可能被舍入。本文给出判断、处理和排查清单。334 收藏 -
Go log/slog 的 ReplaceAttr 可以在属性写入前按字段名和分组路径做遮盖或删除。本文用一个可复用的脱敏函数说明 HandlerOptions 配置、零值 Attr 语义和实际边界。334 收藏 -
环境变量里的布尔值并不只有 true 和 false。本文用 strconv.ParseBool 拆开可接受字面量、空值默认、错误回滚和配置热更新边界,给出一套不会把拼写错误静默当成关闭的 Go 配置写法。333 收藏 -
Go 泛型约束里的类型集和方法集不是一回事。本文用 Number、Stringer、Format 三个真实标识符说明为什么 T 不能随意调用方法,以及如何选择收窄约束、显式转换或交给 fmt 处理。333 收藏 -
Go 的 //go:embed glob 没有匹配文件时会在构建阶段直接失败。本文从包目录、路径模式、单文件与 embed.FS 的差异出发,给出补文件、改路径和最小复查方法。333 收藏 -
ErrWaitDelay 通常表示命令已成功退出,但 os/exec 管理的 I/O 管道在 WaitDelay 内仍未关闭。本文解释计时起点、后代进程继承描述符的常见原因、错误优先级和可落地的修复方式。333 收藏 -
Go netip.Prefix.Contains 返回结果异常时,先检查地址族、映射地址、零值和 IPv6 zone,再确认 Prefix 是否有效以及是否需要 Masked 规范化。333 收藏 -
Go GC 参数改动后延迟升高,通常不是“GOGC 越小越快”这么简单。本文从 GC 周期、分配速率、GC assist 与软内存上限入手,给出最小复现、指标判断和单变量修正方法。333 收藏