Go问答技术文章
-
本文解释 Go 删除切片元素后大对象仍可能被底层数组尾部指针保持可达的原因,对比手动 clear 与 Go 1.22+ slices.Delete,并说明别名切片、GC 时机、堆复用和 RSS 判断边界。174 收藏 -
go test 显示 cached 却没有感知输入文件变化,通常是依赖没有进入测试缓存键。本文说明模块内文件、外部输入和环境变量的处理方法,并给出诊断与 CI 落地方案。174 收藏 -
Go 多个发送方共享 channel 时,接收方无法判断所有发送是否结束,贸然 close 会与发送竞争并触发 panic。本文给出 WaitGroup 唯一关闭者与 context 取消写法。173 收藏 -
Go 的 iter.Seq 没有 error 返回位,遍历过程中的错误应通过结果对象携带;初始化失败则直接作为外层 error 返回,pull 迭代器提前结束还要调用 stop。171 收藏 -
上传中断后残留临时文件,通常是清理责任混淆或 defer 注册过晚。本文区分 ParseMultipartForm 与 MultipartReader 的文件所有权,并给出断流清理、所有权转移和崩溃回收写法。168 收藏 -
Go aes.NewCipher 报 invalid key size 时,关键不是截断或补零,而是确认 key 的实际字节数。本文区分原始字节、hex、base64 和密码输入,给出 16/24/32 字节检查、错误处理与 AES-GCM 调用边界。165 收藏 -
Go SectionReader 通过 base、当前偏移和 limit 建立固定读取窗口。本文解释 Read 的缓冲区裁剪、ReadAt 的相对偏移、EOF、Seek 与 Size 的边界语义。161 收藏 -
Go 的 SetFinalizer 只有在对象变为不可达、GC 发现并完成调度后才可能执行,进程退出不会等待它。本文拆解未执行原因,并用显式 Close、defer 与受控 shutdown 替代退出前清理。159 收藏 -
解释 Go slices.Delete 后 len、cap、尾部零值和外部引用如何共同影响内存释放,并给出清零、Clip 与 Clone 的选择清单。158 收藏 -
Go flag.Parse 放在 init 中并非语法错误,但可能早于同包其他 flag 的注册,导致未知参数、默认值未生效或参数边界被提前消费。本文用初始化顺序和 FlagSet 示例说明正确修复方式。157 收藏 -
Go 1.26+ 的声明式迁移如果没有改写调用点,最常见原因是旧 API 声明前缺少 //go:fix inline。本文同时说明指令位置、适用对象、安全边界,以及复杂自定义 Analyzer 必须提供 SuggestedFixes、通过 unitchecker 与 -fixtool 接入的完整排查方法。157 收藏 -
Golang · Go问答 | 3天前 | channel · panic · 并发编程 · Go问答 · 并发安全 go channel关闭 send on closed channel Golang panic Channel关闭权 多生产者
向已关闭的 Go Channel 发送会触发运行时 panic,因为 close 已声明不会再有新值。本文给出最小复现、单发送者和多发送者安全关闭写法,并说明为什么接收者关闭、isClosed 检查、sync.Once 或 recover 不能替代正确的关闭权设计。156 收藏 -
解释 weak.Pointer.Value 返回 nil 的正常回收语义,区分共享引用容器与目标字段的数据竞争,并给出锁、KeepAlive 和 race detector 的排查写法。153 收藏 -
Go 基准测试变快不等于线上服务变快,本文从 CPU 配额、GOMAXPROCS、GOGC、输入规模、缓存命中和 pprof 指标对照出发,给出一套可重复的排查清单。152 收藏 -
Go 默认 Client 可以被多个 goroutine 并发复用,但并发安全不等于超时与连接池边界适合生产流量。本文区分空闲连接、总连接、请求超时和响应体回收,并给出从默认 Transport 克隆配置的判断方法。151 收藏