Go问答技术文章
-
Go 的 FormatFloat 和 printf 只能控制浮点数的显示格式,不能把二进制 float64 变成精确十进制。本文用 0.1+0.2 说明误差来源,并比较展示格式、整数最小单位和高精度十进制三种处理方式。263 收藏 -
Go 超时配置写成整数时,time.Duration 会按纳秒解释,1 并不是 1 秒。本文解释单位原因,给出固定值、整数配置和带单位字符串的正确写法,并整理超时排查清单。354 收藏 -
Go 两个 time.Time 显示相同但用 == 比较不相等,通常是 Location 或 monotonic clock 不同。本文通过原创示例解释 Equal 与 == 的边界,并给出 map 键、数据库精度和业务日期的正确写法。382 收藏 -
讲清 Go 的 json.Marshal 对 map 键的支持边界:字符串、整数和 encoding.TextMarshaler,以及结构体、浮点数等键的替代方案。317 收藏 -
Go 结构体转 JSON 得到 {},通常是字段未导出、json 标签明确忽略字段,或所有字段被 omitempty 按零值省略。本文用最小示例和检查清单说明如何快速定位并修复。374 收藏 -
Go strings.Trim 的第二个参数是字符集合,不是完整子串。本文用边界示例说明 Trim、TrimPrefix、TrimSuffix 与 TrimSpace 的区别,避免裁剪协议前缀和业务标记时误删内容。350 收藏 -
Go recover 不能跨 goroutine 捕获 panic。本文用一个 panic-safe worker 小项目说明控制栈作用域、直接 deferred recover、error channel 与 WaitGroup 的正确组合。238 收藏 -
Go defer 的函数参数在 defer 执行时就会求值保存,不是函数退出时才读取。本文用参数、闭包、LIFO 和命名返回值示例说明如何判断最终打印结果。468 收藏 -
Go append 后原切片看起来也变了,根因通常是多个切片共享底层数组且容量仍有余量。本文用 len、cap、三下标切片和 copy 说明复用边界,并给出追加隔离与完全复制的选择方法。130 收藏 -
Go 切片只是底层数组的一段描述符,直接返回大缓冲区中的小片段时,指针仍可能让整个数组保持存活。本文用切片长度、容量和复制副本说明保留原因,并给出 make+copy、append 复制和指针元素清理的实用边界。213 收藏 -
Go 接口不等于 nil 时,问题通常不是 nil 比较失效,而是接口仍携带动态类型。本文用 typed nil、error 返回和类型断言示例,说明如何定位调用失败并修正返回边界。358 收藏 -
Go 的 range 读 Channel 不会因为暂时没有消息而结束,只有发送方关闭通道才会收到结束信号。本文从阻塞复现、单发送者关闭、多发送者协调和提前退出取消四个场景,整理一套不 panic、不泄漏的收尾方式。101 收藏 -
把 os.File 遍历迁移到 io/fs.FS 时,WalkDir 返回的是文件系统内部的逻辑路径。本文说明如何在交给外部工具前安全转换为操作系统路径,并列出跨平台回归检查点。386 收藏 -
短超时压测后 Goroutine 数量不回落,不一定都是 Context 失效。本文用 worker pool 拆开工作取消与结果发送两个等待点,给出可执行的 Go 修复写法和 pprof 定位方法。265 收藏 -
Go 错误一旦经过 fmt.Errorf 包装或 errors.Join 合并,直接比较和类型断言就容易失效。本文用 errors.Is、errors.As 和 Join 建立稳定的分类与诊断路径。184 收藏