Go问答技术文章
-
sync.OnceFunc 会缓存初始化函数的 panic 结果,失败后再次调用不会自动重试。本文用最小示例拆开成功、失败和显式重试三种边界。325 收藏 -
time.Time.Round 按绝对时间而不是显示出来的本地小时取整,所以跨日期、带时区和带单调时钟的值容易出现误判。本文用可复现的 Go 示例拆开 Round、Truncate、Location、== 与序列化的边界。325 收藏 -
RWMutex 不会天然比 Mutex 快。本文用并发配置缓存说明读写锁的临界区边界、待写者阻塞新读者、不可升级降级等语义,并给出可调整读写比例的基准模板,帮助你按真实竞争场景做选择。325 收藏 -
多个生产者共享 Go channel 时,应由唯一协调者等待全部生产者退出后关闭;接收端用 ok 区分关闭信号与有效零值,避免发送 panic。324 收藏 -
Go 的 Rows.Next 返回 false 既可能是正常读完,也可能是遍历途中出错。本文说明 Rows.Err、Scan 和 Close 各自负责什么,并给出完整查询模板。324 收藏 -
Go 调用方超时并不代表下游工作已经停止。本文用一条清晰的调用链说明如何把 Context 传到真正执行 I/O 的函数,在阻塞点响应取消,并用 cancel 和 Cause 正确收尾。323 收藏 -
Go TLS 客户端遇到证书错误时,直接设置 InsecureSkipVerify=true 只会关闭证书链和主机名校验。本文按错误分支拆开 ServerName、RootCAs 与 VerifyConnection,给出保留安全校验的排查和配置方式。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 将 JSON 解码到 any 时会默认使用 float64,大整数超过双精度可精确表示范围后可能被改写。本文用复现、UseNumber 和明确整数类型说明如何保留精度。321 收藏 -
Go 里 Stat 会关注符号链接指向的目标,Lstat 则保留链接自身的信息。本文用 FileInfo、ModeSymlink、断链和 Readlink 示例说明如何选择。320 收藏 -
Go errors.Join 会丢弃传入的 nil 错误;如果所有参数都是 nil 则返回 nil,否则返回只包含非 nil 成员的组合错误。本文用边界输入说明如何判断和检查成员。320 收藏