Go问答技术文章
-
Go 程序在本地和容器中出现时区差异,通常不是 Format 的问题,而是 time.Local、TZ 环境变量与 IANA 时区数据来源不同。本文给出 UTC 存储、显式 Location 展示和容器缺少时区数据库时的兼容方案。272 收藏 -
Go 日志在容器里延迟出现,通常不是一个笼统的“Go 有缓冲”问题。本文沿着 log/slog 的 handler、stdout/stderr、容器日志流和采集器批量策略逐段定位,并给出不增加无谓缓冲的修复方式。243 收藏 -
Go http.Server 的 MaxHeaderBytes 只限制解析请求行和请求头的读取范围,不限制请求体。本文从自定义 Server 是否生效、前置代理边界和 MaxBytesReader 三个层面说明为什么看起来仍能收到大请求。364 收藏 -
Go 收到信号后仍不退出,要区分通知送达、工作取消与 main 生命周期。本文说明缓冲信号通道、NotifyContext、stop、完成回执及有界等待,给出 Linux/macOS 的完整示例并明确超时退出的清理代价。154 收藏 -
Go 服务健康检查失败而业务接口仍能访问,通常不是业务处理器坏了,而是探针路径、监听地址、状态码或依赖检查边界没有分开。本文用一个最小 net/http 服务拆开存活、就绪和业务依赖检查,并给出按现象定位与部署验收的方法。349 收藏 -
Go HTTP 客户端重试 POST 时,超时只说明客户端没有拿到结果,并不能证明服务端没有处理。本文从请求体、方法语义、幂等键和响应体关闭四个方面,给出一套可控的重试写法。427 收藏 -
Go crypto/tls 的 InsecureSkipVerify 会同时跳过证书链和主机名校验。本文说明它的中间人风险,并给出 RootCAs 与 VerifyConnection 的安全替代方案。452 收藏 -
time.Duration 本质是纳秒整数,String 会按可读性自动选择小时、分钟、秒、毫秒、微秒或纳秒,并保留负值符号。本文用典型场景解释这些输出为什么不同,以及接口需要固定格式时怎么处理。339 收藏 -
Go 使用 archive/tar 解包时,权限差异常常不是 Header.Mode 丢失,而是创建权限受到 umask 影响或目录没有显式 Chmod。本文按普通文件、目录和特殊条目拆开处理,给出一套可复用的还原思路。200 收藏 -
说明 Go gzip.Writer.Close 为什么不能省略:它会完成压缩状态并写出 gzip 尾部信息。文章给出正确的 defer 关闭顺序,区分 Flush 与 Close,并整理读取不完整、底层关闭失败等排查边界。374 收藏 -
Go text/template 执行成功但页面为空,通常不是 Execute 没运行,而是写入目标、模板入口、数据字段或空值分支出了偏差。本文给出从输出长度到 ExecuteTemplate 的排查顺序。197 收藏 -
bufio.Writer 写入成功不代表数据已提交给文件。本文说明关闭前 Flush 的正确位置、写入与关闭错误的保留方法,以及 Flush 和 Sync 的区别,给出不覆盖已有文件的报表写入示例。430 收藏 -
Go regexp 匹配中文异常,通常不是 UTF-8 失效,而是把 ASCII 字符类、过窄的码位范围或字节下标当成了 Unicode 规则。本文用 \p{Han}、\w、\b 和 rune 示例拆开边界,给出可直接套用的排查方式。221 收藏 -
Go 自定义 MarshalJSON 时直接再次编码原类型会无限递归。本文说明 json.Marshaler 的触发原因,并用新的定义类型复用默认字段编码、追加自定义字段,同时保留错误处理边界。169 收藏 -
Go netip.Prefix 解析 CIDR 后为什么还保留主机位?关键在于 ParsePrefix 和 PrefixFrom 都不会替调用者自动掩码。本文说明 Prefix、Masked、Contains 的职责边界,并给出在展示、存储和地址匹配边界处统一规范化的写法。338 收藏