Go问答技术文章
-
Go 调用方超时并不代表下游工作已经停止。本文用一条清晰的调用链说明如何把 Context 传到真正执行 I/O 的函数,在阻塞点响应取消,并用 cancel 和 Cause 正确收尾。323 收藏 -
Go TLS 客户端遇到证书错误时,直接设置 InsecureSkipVerify=true 只会关闭证书链和主机名校验。本文按错误分支拆开 ServerName、RootCAs 与 VerifyConnection,给出保留安全校验的排查和配置方式。323 收藏 -
用 Go httptrace.GotFirstResponseByte 记录响应头首字节延迟,区分服务端等待、响应体读取和 HTTP/2 不适用边界。323 收藏 -
Go regexp.Compile 失败时,关键不是把错误吞掉,而是把正则来源、配置字段和底层语法错误一起带回启动流程。本文结合 MustCompile 的适用边界,给出代码常量、环境变量和配置文件的选择方法。323 收藏 -
Go pprof 里找不到一个很短的函数,不一定代表它没有执行。CPU profile 记录的是离散采样时刻的活跃调用栈,短函数可能因命中次数少而没有独立排名。本文从 flat、cum、采样窗口、源码定位和 profile 类型五个角度给出排查流程。323 收藏 -
Go把JSON数字解码到通用接口时通常使用float64,部分大整数因此发生舍入。本文结合导入标识场景,比较UseNumber、int64字段和字符串契约,并说明范围错误、上游精度丢失与跨服务迁移的处理方法。323 收藏 -
reflect.TypeFor[T]() 能在泛型代码里直接取得类型参数 T 的 reflect.Type,避免用零值或指针哨兵绕一圈。本文用类型注册表拆开 nil、指针、接口类型和缓存键的边界,说明它与 TypeOf 的职责差异。322 收藏 -
Go 1.23 引入的 unique 包适合把可比较值规范化为可比较的 Handle。本文用一个小型标签池说明 unique.Make、Handle.Value 和垃圾回收之间的边界:句柄要保留多久、为什么比较更轻,以及何时不该把它当成永久缓存。322 收藏 -
用同一份 HTTP 请求验证 Request.CookiesNamed 的同名 Cookie 筛选、返回顺序、空切片和 Cookie 方法的单值差异,说明 Go 1.23 之后如何安全读取重复 Cookie。322 收藏 -
Go benchmark 的 allocs/op 偏高时,不要先猜编译器或垃圾回收;从测试夹具、循环内临时值、切片扩容、字符串转换和逃逸边界逐项拆分,才能定位真正的分配来源。322 收藏 -
go test -race 能发现共享变量数据竞争,是因为它在实际运行时记录普通读写,并依据 happens-before 关系判断并发访问是否缺少同步。本文用一个共享计数器说明报告结构,并比较 mutex、channel 与 atomic 的修复边界。322 收藏 -
Go x/text/search 的匹配规则可以按语言处理大小写、重音和宽度,但 IndexString 返回的 start/end 仍应按原始 UTF-8 字节偏移使用。本文说明如何切取原文,并安全转换为 rune 下标。322 收藏 -
Go x/text/collate 的 IgnoreCase 只负责大小写比较权重,不会自动忽略重音、全半角、语言规则或数值差异。本文用 CompareString、Option 组合和检查表说明如何选择。322 收藏 -
Go encoding/csv 默认按较严格的 CSV 引号规则解析。本文说明 Reader.LazyQuotes 放宽的两类引号错误、开启时机、ParseError 处理方式,以及为什么容错读取不能替代下游数据质量控制。322 收藏 -
Go 的 mime.WordDecoder.Decode 专门解码一个 RFC 2047 encoded-word。本文用最小示例说明 UTF-8、CharsetReader、错误处理,以及它与 DecodeHeader 的输入边界。322 收藏