Go问答技术文章
-
Go 的 sync.Map.Clear 可以一次清空映射中的全部条目,但它只适合明确的批量失效场景。通过并发读写示例、基线测量和结果核对,说明 Clear 的可见性、成本与替代方案。498 收藏 -
Go regexp.FindStringSubmatch 返回 nil 只表示整体没有匹配;匹配成功但捕获组为空时,切片仍然存在。本文用最小示例区分 nil、空字符串和可选分组,并给出稳定判断写法。290 收藏 -
Go 用 strconv.AppendInt 把整数追加到 []byte 时,关键不是记住一个性能结论,而是看清切片长度、容量和底层数组何时变化。本文用可运行代码说明复用缓冲区的边界,并处理别名切片带来的覆盖问题。287 收藏 -
Go 的一次性值闭包适合把昂贵初始化延迟到第一次真正使用时,并保证并发调用只执行一次。本文用标准库代码说明闭包状态、panic 记忆和失败返回值的边界。113 收藏 -
slog.LogValuer 适合把昂贵或需要脱敏的日志值延迟到 Handler 真正处理时再计算,但它不是所有日志字段的默认包装。本文用 LogAttrs、Handler.Enabled 和 LogValue 的真实调用链说明何时值得使用,以及递归解析和敏感字段的边界。359 收藏 -
Go 的 atomic.Int64 不能在首次使用后复制。本文从 noCopy 约束、指针接收者和结构体字段设计出发,给出并发计数的安全写法与检查方法。258 收藏 -
Go 的 io.Reader 读取循环里,io.EOF 通常表示输入已经结束,但 n 仍可能大于 0。本文用一个可复现的读取器说明短读、空读和 EOF 的处理顺序,避免丢掉最后一段数据或写出忙等循环。137 收藏 -
Go 的 time.Duration 本质是 int64 纳秒数。本文用具体换算、溢出判断和定时器示例说明,为什么长时间配置会变成负数,以及如何在进入 time.NewTimer 或 time.After 前拦住错误值。348 收藏 -
time.Duration 本质是纳秒数,直接转成整数时会按目标单位截断小数。本文从接口参数和调用方预期出发,拆解单位常量、整数除法、浮点换算与超时配置的边界,给出可核对的写法。288 收藏 -
Go 的 flag.FlagSet 适合把一个命令拆成互不干扰的子命令。本文从 serve 和 inspect 两个入口出发,说明参数归属、错误输出、帮助信息和兼容演进应该怎样划边界。468 收藏 -
Go 的 json.Decoder.DisallowUnknownFields 能及时发现请求体中的未知字段,但直接全局开启也可能破坏旧客户端兼容。本文用可运行示例拆解严格解析、错误定位、兼容迁移和上线检查清单。201 收藏 -
Go 1.20 引入的 errors.Join 可以把多个失败原因合成一个可匹配的错误。本文用批量校验和并发收口示例,说明遍历顺序、errors.Is/errors.As 的匹配边界,以及如何输出不丢信息的日志。150 收藏 -
Go 的 []byte 传递经常隐藏底层数组共享。本文用 bytes.Clone 拆开切片别名与大数组内存保留两个问题,给出判断时机、基准验证和边界取舍。138 收藏 -
strings.Builder 适合高效拼接字符串,但写入后复制会触发运行时检查。本文从零值使用、复制边界和返回字符串的别名风险说明正确写法。483 收藏 -
Go 中同一个 os.File 先写后读时,读到 EOF 往往不是文件没有内容,而是文件偏移已经停在末尾。本文用可运行示例拆解 Seek、ReadAt 和偏移复位的差异,说明何时共享游标、何时使用定位读取。103 收藏