Go问答技术文章
-
Golang · Go问答 | 3星期前 | 随机数 · 错误处理 · Go问答 · 安全编程 · Go crypto/rand rand.Read错误处理 Go随机字节读取 io.ReadFull短读 Go安全令牌生成
围绕 Go crypto/rand.Read 的 n、err 和长度边界,说明如何封装随机读取、测试短读错误,并在成功前阻止半成品随机数据进入业务。158 收藏 -
解释 Go slog LogValuer 递归引用为何会得到错误值,拆解 Value.Resolve 的有限求值、Group 边界、Handler 处理方式和四组测试。158 收藏 -
解释 Go slices.Delete 后 len、cap、尾部零值和外部引用如何共同影响内存释放,并给出清零、Clip 与 Clone 的选择清单。158 收藏 -
bbolt 的 View 回调里再次调用 Update 可能长期阻塞。本文解释单写事务与读事务的生命周期关系,给出读取结果复制到事务外、再独立写入的处理方式,以及回滚、告警和复盘清单。158 收藏 -
Go 的 exec.Cmd.WaitDelay 不只是进程超时参数,它还限制子进程退出后 stdout/stderr 管道迟迟不关闭的等待时间。本文说明计时起点、ErrWaitDelay 与 ExitError 的区别,以及如何安全判断返回值。157 收藏 -
Go flag.Parse 放在 init 中并非语法错误,但可能早于同包其他 flag 的注册,导致未知参数、默认值未生效或参数边界被提前消费。本文用初始化顺序和 FlagSet 示例说明正确修复方式。157 收藏 -
Go 1.26+ 的声明式迁移如果没有改写调用点,最常见原因是旧 API 声明前缺少 //go:fix inline。本文同时说明指令位置、适用对象、安全边界,以及复杂自定义 Analyzer 必须提供 SuggestedFixes、通过 unitchecker 与 -fixtool 接入的完整排查方法。157 收藏 -
Go database/sql 查询只取前几行时,提前 break 并不会替调用方表达完整的资源释放意图。本文从 Rows 的接口职责出发,说明为什么拿到结果集后应尽早安排 Close,并区分 Scan、Rows.Err 与 Close 的错误处理边界。157 收藏 -
Go 1.19 引入的 fmt.Appendf 可以把格式化结果直接追加到已有字节切片,适合协议拼接、日志缓冲和小型序列化场景。本文说明返回值、容量扩展、兼容写法和基准测试边界。156 收藏 -
Go 的 http.Transport 可能自动请求并解压 gzip,导致 Response.Body 可直接读取明文,而 Content-Encoding 和 Content-Length 被移除。本文说明触发条件、验证方式以及如何保留原始压缩字节。156 收藏 -
Go race 报告没有栈信息时,先区分没有触发竞态、历史栈恢复失败和日志截断,再用 go test 的 -run、-count、-cpu 与 GORACE 的 history_size、log_path 提高复现和定位效率。156 收藏 -
fstest.TestFS 报错通常不是测试器过于严格,而是自定义 fs.FS 在路径合法性、目录元数据、文件重复读取、expected 清单或并发修改上没有满足 io/fs 约定。本文用 MapFS 拆解定位顺序和修复边界。156 收藏 -
Golang · Go问答 | 1星期前 | channel · panic · 并发编程 · Go问答 · 并发安全 go channel关闭 send on closed channel Golang panic Channel关闭权 多生产者
向已关闭的 Go Channel 发送会触发运行时 panic,因为 close 已声明不会再有新值。本文给出最小复现、单发送者和多发送者安全关闭写法,并说明为什么接收者关闭、isClosed 检查、sync.Once 或 recover 不能替代正确的关闭权设计。156 收藏 -
Go 的 net/http.Header.Get 只返回一个值。本文用可复现的响应头示例说明 Header.Get、Header.Values 与 Header.Add 的关系,帮你判断何时该读取单值、何时必须遍历全部值。155 收藏 -
Go 的 defer 可能在函数真正返回前修改命名返回值。本文用错误包装场景拆开 return 与 defer 的执行顺序,并给出显式返回、只读观测和测试检查的实用写法。155 收藏