Go问答技术文章
-
Go module replace 在 CI 中不生效,通常不是 replace 语法失效,而是 CI 读取了错误的主模块、缺少 require、精确版本没有命中,或本地替换目录没有随 checkout 进入构建环境。本文用 go env 与 go list 逐层定位并给出可提交的修正方式。488 收藏 -
Go embed 在编译期把文件内容写入运行包,修改磁盘文件后必须重新构建并确认启动的是新产物。本文用 embed.FS 示例说明旧二进制、路径不一致和开发态加载方式的排查边界。337 收藏 -
Go 出现 import cycle 时,问题不是 init 顺序,而是包依赖图已经形成闭环。本文从最小循环、共享类型下沉、消费方接口和组合根四个角度,整理一套可以长期维护的拆包方法。155 收藏 -
Go 的 Clean、Join 和 IsLocal 主要做词法路径判断,遇到符号链接时看不见最终目标。本文用最小复现说明原因,并给出先做词法拦截、再用 EvalSymlinks 与 Rel 判断解析后路径的读取方案,同时说明检查与打开之间的竞态边界。255 收藏 -
time.Time.MarshalText 会把零值时间编码成合法的 RFC 3339 文本,而不会自动变成空字符串或被省略。本文说明如何用 IsZero 判断零值,区分文本接口与 JSON 字段策略,并选择值类型、指针或包装类型。460 收藏 -
Go 调用 os.File.Sync 后数据仍不可见,通常不是 Sync 失效,而是 bufio 缓冲尚未 Flush、Write 错误未处理、读取端沿用旧偏移,或把稳定存储误当成通知机制。本文按边界拆开排查并给出安全写法。370 收藏 -
Go time.Ticker 在接收方处理较慢时会调整节奏或丢弃 tick。本文区分可跳过的状态刷新、必须补偿的周期任务和不能依赖 ticker 的可靠事件,给出带中文注释的 Go 实现与选择表。361 收藏 -
strconv.ParseUint 不接受前导加号或负号。通过批量大小命令行示例,区分符号策略、固定十进制、位宽范围与业务区间,并说明语法错误、范围错误和旧协议加号兼容的处理方式。314 收藏 -
Go 的 Location 会影响时间的构造解释和展示,但不等于改变实际时间点。本文说明 Equal、Before、After 与 == 的区别,并处理 ParseInLocation、UTC、序列化和单调时钟的常见边界。451 收藏 -
Go WebSocket 断开后没有马上出现错误,常见原因是程序没有持续读取连接。本文用 Gorilla WebSocket 说明 CloseError、读循环、关闭处理器和读超时的边界。338 收藏 -
Go 请求变慢时,先把主机名解析和拿到 IP 后的连接分别计时,再用 net.Resolver 的 PreferGo 与 Dial 判断解析器路径,避免把 DNS 问题误判成 TCP 或业务代码问题。500 收藏 -
Go Transport 配置看似未生效,需区分旧实例归属、连接复用和配置作用阶段。结合客户端工厂与顺序切换示例,说明不可变配置、响应体排空、闲置连接回收及热更新的失败边界。269 收藏 -
从 Go TLS 握手错误、ServerName、RootCAs 和 MinVersion/MaxVersion 入手,区分证书校验失败与协议版本协商失败,并给出不关闭证书验证的修正方式。128 收藏 -
Go HTTP 连接池出现空闲连接通常是 keep-alive 复用的正常结果。本文从 Response.Body、Transport 复用和三个空闲连接参数入手,给出排查与收紧连接池边界的方法。285 收藏 -
Go 流式响应中 ResponseController.Flush 返回错误时,先用 errors.Is 区分 ErrNotSupported 与底层刷新失败,再检查 ResponseWriter 包装层、写入时机和代理缓冲,避免把客户端延迟误判成服务端能力不支持。226 收藏