Go问答技术文章
-
Go recover 必须在发生 panic 的同一 goroutine 中由延迟函数直接调用,父函数不能恢复子任务 panic。通过同步与异步示例解释恢复位置、命名返回值和 Result 回传,并保留堆栈、明确数据一致性与新任务边界。461 收藏 -
Go 中 errors.As 取不到自定义错误字段,通常不是字段不存在,而是目标类型、指针层级或错误链没有对上。本文从故障现场拆开直接返回、%w 包装、值与指针接收者和 Unwrap 的边界,给出可复查的修复清单。166 收藏 -
Go 中 errors.Is 返回 false,通常不是判断函数失效,而是错误链没有通过 %w 保留下来,或比较目标每次都由 errors.New 新建。本文用最小示例拆开包装、哨兵错误、自定义 Is 和 errors.Join 的边界,给出可复查的修复清单。494 收藏 -
Go goroutine 捕获循环变量可通过显式形参固定每轮任务值。本文区分 Go 1.22 后的声明式循环与外部变量复用,用 WaitGroup 给出完整示例,并解释指针、切片和 map 的共享边界,避免把参数副本误当深拷贝。369 收藏 -
Go range 中直接保存 &value,可能把循环变量副本的地址重复保存,导致多个指针看起来指向同一个对象。本文从切片、map、闭包和 Go 1.22 模块语义四个边界排查原因,并给出稳定的下标取址与独立副本写法。456 收藏 -
解释 Go defer 在循环中的函数边界,给出局部函数及时关闭文件的写法,并整理打开、读取、关闭和并发上限的排障清单。276 收藏 -
解释 Go defer 参数求值、闭包捕获和 Go 1.22 循环变量语义,给出跨版本固定每轮值的写法。295 收藏 -
Go 时间格式化与本地时区不同,通常来自时间值 Location、输入解析语义或部署环境差异。通过显式加载业务时区、使用 In、区分 ParseInLocation 与展示转换,并为容器提供时区数据,避免固定加小时造成错误。292 收藏 -
Go 中格式化时间字符串适合展示,不适合作为通用的先后判断依据。本文用跨月份、时区和精度的例子说明字符串比较为什么会误判,并给出基于 time.Time、Before、After、Equal 与 Compare 的稳妥写法。177 收藏 -
Golang · Go问答 | 3星期前 | 超时 · go · HTTP服务 · net/http · Go net/http ResponseController SetReadDeadline 请求体超时
Go HTTP 服务端要限制慢请求的读取时间,可以用 ResponseController.SetReadDeadline 设置整次请求读取的截止时间。它覆盖请求体读取,零值表示取消 deadline,已经过期后不能靠重新设置更晚时间延长;还要区分 ResponseWriter 不支持该能力与请求本身读取超时。112 收藏 -
在 Go 的 MarshalJSON 中复用默认结构体编码时,使用不带方法的新定义类型切断递归;本文给出安全写法、扩展字段方式,以及真别名和指针接收者的边界。460 收藏 -
Golang · Go问答 | 3星期前 | 并发 · map · Mutex · go · Go sync.Map sync.Mutex concurrent map writes map 并发写入
Go map 并发写入可能直接触发 concurrent map writes。本文从只读与更新边界讲起,解释不同键为什么仍不安全,再对比 mutex、RWMutex、单 goroutine 所有权和 sync.Map 的适用场景,并用竞态检测器做回归检查。471 收藏 -
Go 的 atomic 操作只为原子访问提供同步语义,同一共享变量若再混用普通读写,仍可能产生数据竞争。本文按资产、攻击路径、防护控制和验证清单说明统一访问策略。395 收藏 -
Go sync.Map.CompareAndSwap 返回 false 时,先用 Load 区分键不存在、值类型不符和旧值不一致,再把 CAS 失败视为并发竞争信号;不要把一次读取结果直接当作更新成功保证。388 收藏 -
Go race 检测器报告 map 并发读写时,先从两条访问栈确认共享对象和冲突类型,再用 go test -race 稳定复现,最后按访问模型选择 sync.RWMutex、单写者 channel 或不可变快照,避免只把一处读写临时包进锁里。299 收藏