Go问答技术文章
-
Go 接口只有动态类型和动态值同时为空时才等于 nil。把值为 nil 的具体指针返回给 error,会让接口携带该指针类型,从而出现 err != nil。本文用最小示例说明原因、观察方法和正确修复方式。140 收藏 -
Go url.PathEscape 直接处理路径片段时会把斜杠编码为 %2F;如果观察到斜杠,通常是读取了解码后的 URL.Path,或混用了路径拼接与查询参数编码。本文用最小示例区分 PathEscape、QueryEscape、RawPath 和 EscapedPath。462 收藏 -
Go crypto/subtle.WithDataIndependentTiming 用于在回调期间启用架构相关的数据独立时序能力,但不会把普通变长代码自动变成常量时间。本文用 ConstantTimeCompare 说明正确包法、goroutine 作用域、架构差异和安全边界。391 收藏 -
Go map 在 range 期间新增键可能被访问,也可能不会被访问。本文区分单协程修改与并发读写,给出键快照和显式待处理队列两种稳定方案。444 收藏 -
Go sync.RWMutex 的 RLocker 会把读锁能力适配为 sync.Locker:调用 Lock 实际执行 RLock,调用 Unlock 实际执行 RUnlock。本文用通用组件、读写生命周期和边界示例说明怎样安全复用它。261 收藏 -
Go 在 ARM、386 和 32 位 MIPS 上对 64 位原子操作有额外的对齐要求。本文从结构体字段布局入手,说明如何识别中间字段错位、改用类型化原子类型,以及必须使用旧式函数时怎样重排字段。228 收藏 -
sync.Map.Range 能遍历当前可见的键值,但它不提供一致性快照。本文用并发缓存盘点示例说明 Store、Delete 与 Range 的可见性边界,并给出锁、版本号和独立快照三种更可靠的判断方式。392 收藏 -
Go 服务出现请求卡住时,可以用 runtime/pprof 的 goroutine profile 导出当前所有 goroutine 堆栈。本文对比 HTTP 端点和信号触发两种方式,并说明怎样从等待状态与重复栈定位问题。289 收藏 -
Go 中无缓冲结果 channel 如果没有接收方,发送 goroutine 会一直等待。本文用一个具体的结果返回场景说明提前返回为何造成泄漏,并给出取消发送、容量为一的缓冲和通道所有权边界的处理方式。108 收藏 -
Go 1.23 后无引用 ticker 可被 GC 回收,但后台 goroutine 仍持有 ticker 或没有退出条件时,任务依旧会长期存活。本文用生命周期、Stop 和退出信号拆开排查。417 收藏 -
RegisterOnShutdown 适合快速发出协议关闭通知,不应在回调里等待清理完成。本文用 channel、WaitGroup 和超时上下文组织可控的异步退出流程。351 收藏 -
Go 读取已关闭 channel 时会得到元素类型零值,但双返回值中的 ok 会变成 false。本文区分开放空通道、已关闭通道和缓冲值,说明单次接收、range 消费与关闭责任的正确约定。424 收藏 -
Go WithoutCancel 保留父级值查询,却不继承取消、deadline 与取消原因。本文解释 nil Done 的阻塞行为,用完整示例重新建立独立工作预算,并说明值引用、资源和权限的边界。406 收藏 -
在 Go 的 select 中,把某个分支使用的局部 channel 变量设为 nil,就能让这个通信 case 暂时不可用;恢复为真实 channel 后分支重新参与选择。本文比较 nil、关闭 channel 和 default 的语义与使用边界。133 收藏 -
Go context 的 Done 只能通知退出,Err 只能说明取消类别。本文用 WithCancelCause 和 Cause 区分超时、主动取消与业务失败,并解释父子 Context 首次取消的传播边界。169 收藏