Go问答技术文章
-
Go 的 net.Resolver.LookupAddr 反向解析返回的是名称切片,遇到多个 PTR、部分结果、无记录或超时不能只判断一个字符串。本文用带超时的示例说明如何保留可用结果、分类处理错误,并把结果整理成稳定日志字段。155 收藏 -
Go 泛型约束写了具体类型,却不代表类型参数拥有该类型的全部方法。本文从类型集、方法集和接口约束的边界出发,解释常见编译错误,给出可运行的修复写法,并说明什么时候该把行为写进约束。154 收藏 -
用 Go 的 slog.LogValuer 控制日志字段的延迟求值与脱敏,厘清日志级别过滤、LogValue、slog.String 和 slog.Group 的调用边界。154 收藏 -
解释 Go database/sql 中 Tx.Stmt 复用 DB 级预处理语句时的对象归属、事务绑定、关闭责任、上下文与并发边界。154 收藏 -
Go 收到信号后仍不退出,要区分通知送达、工作取消与 main 生命周期。本文说明缓冲信号通道、NotifyContext、stop、完成回执及有界等待,给出 Linux/macOS 的完整示例并明确超时退出的清理代价。154 收藏 -
Go range 遍历结构体切片时,第二个变量通常是当前元素的值拷贝,修改它不会写回原切片。本文用最小示例说明原因,并给出按索引写回、只读值变量和指针切片三种选择。154 收藏 -
用 Go 的 embed.FS 把 Markdown 和静态资源打进单个二进制,再通过 net/http 提供本地预览,覆盖目录组织、路径处理、缓存和构建验收。153 收藏 -
Go 1.27 新增 crypto/mldsa,本文从消息签名、crypto/x509 和 TLS 1.3 三层边界说明它适合替换什么,以及为什么不应把它当成通用加密方案一次性切换。153 收藏 -
Go 的 nil slice 和非 nil 空 slice 长度都为 0,但 encoding/json 默认分别编码为 null 和空数组。本文解释两种状态、omitempty 的影响,以及如何在 API 响应层稳定输出 []。153 收藏 -
解释 weak.Pointer.Value 返回 nil 的正常回收语义,区分共享引用容器与目标字段的数据竞争,并给出锁、KeepAlive 和 race detector 的排查写法。153 收藏 -
Go 的一次取值函数适合惰性初始化,但初始化函数一旦 panic,后续调用会再次 panic,而不是自动重试。本文拆开这个语义,给出可观测、可控的失败处理方案。152 收藏 -
Go 的 os.File.ReadAt 适合多个 goroutine 按独立偏移量并发读取同一个文件,但每次调用仍要检查 n 和 err,尤其要正确处理 n < len(buf) 的短读与 io.EOF。152 收藏 -
Go benchmark 结果波动时,先划清 b.N 的计时边界,再用 ResetTimer、benchmem、allocs/op、B/op 和 AllocsPerRun 判断分配是否真的影响了结果。152 收藏 -
Go 导入 internal 包被拒绝时,应先定位 internal 目录上方的允许路径,再用 go.mod 和 go list 对照 ImportPath、Module.Path 及嵌套 module,最后选择移动调用方或提取公开 API。152 收藏 -
Go maps.Clone 传入 nil map 后,返回值仍是 nil:读取安全但写入会 panic。本文对比 nil map 与空 map 的长度、读写和初始化差异,并说明 Clone 对嵌套 slice、map、指针值仍是浅复制。152 收藏