Go语言技术文章
-
Go sync.Once 卡住时,先从初始化 goroutine 的栈确认阻塞资源,再排除重入、锁闭环和无界外部 I/O;需要重试时使用显式状态或新的拥有者,不要直接清零 Once。199 收藏 -
用 Go json.Decoder 读取连续 JSON 对象时,区分正常 io.EOF、语法损坏、截断输入和类型错误,并用 RawMessage 处理多态载荷。411 收藏 -
sync.Once 的初始化函数 panic 后不会自动重试。本文解释 Do 的完成语义、recover 的正确位置、OnceFunc 的差异,以及需要重试时的替代设计。428 收藏 -
Go 接口返回多态 JSON 时,可先用 json.RawMessage 保留 payload,再根据 kind 选择目标结构体二次解码,并明确处理 null、未知字段和未知类型。229 收藏 -
Go 结构体同时保存 map 和 sync.Mutex 时,值接收者会复制锁而不是复制同一把锁。本文说明 map 与 mutex 的复制差异,并给出指针接收者、Mutex/RWMutex 选择和竞态排查方法。199 收藏 -
解释 Go http.Cookie 同时设置 MaxAge 与 Expires 时的序列化结果、浏览器优先级,以及持久化、会话和删除 Cookie 的配置排查方法。401 收藏 -
Go vet 提示复制锁时,通常应把包含 sync.Mutex 的方法从值接收者改成指针接收者,而不是把锁改成指针字段。本文说明值接收者的隐式复制、接口方法集和无锁快照的正确边界。144 收藏 -
Go 读取同名 Cookie 时,Cookie 方法只返回一个值;本文用 CookiesNamed 和 ParseCookie 保留头部顺序,并说明服务端无法从请求头反推出 Path、Domain、SameSite 与过期时间。465 收藏 -
Go 结构体一旦包含 sync.Mutex,就不能把它当普通值随意复制。本文用共享 map 的例子说明值接收者和 b := a 为什么会让两份锁保护同一份数据,并给出指针接收者、显式 Clone 与 go vet 检查方法。273 收藏 -
用 Go 的 http.Cookie 设置 SameSite、Secure、HttpOnly 和过期时间,解释三种 SameSite 模式、MaxAge 正负值以及从 Set-Cookie 响应头排查属性不生效的方法。430 收藏 -
Go select 不会按 case 的源码顺序固定选择;多个通信同时可运行时会在可运行集合中做均匀伪随机选择。本文用两阶段探测、退避和指标记录,避免把随机选择误判成业务优先级。120 收藏 -
net/http.ServeMux 注册 /orders/ 子树后,访问 /orders 可能先发生尾斜杠重定向。本文用 Go 1.22+ 方法模式和 {$} 精确匹配说明如何固定 POST 规范地址、兼容两种路径,并排查 301、302、307、308 对请求体的影响。290 收藏 -
Go 的 select default 只说明本次 channel 未就绪,不等于任务失败。本文用 pending 状态、指数退避、随机抖动和 context 取消,说明非阻塞收发如何降频重试并避免丢任务。438 收藏 -
Go 1.22 之后,ServeMux 不按注册先后决定路由,而是比较方法、主机和路径对应的请求集合。本文用字面量、单段通配符、尾部通配符和方法模式说明什么叫更具体,为什么有些模式会在注册时直接冲突。233 收藏 -
Go select 发送到满 channel 时,default 只能让本次发送立即返回,不能代替重试和关闭协议。本文用有界事件队列说明如何选择立即丢弃、有限退避或带超时阻塞,并给出指标与验收清单。384 收藏