Go语言技术文章
-
Go panic 不是另一种 error 返回值,而是会沿当前 goroutine 调用栈展开的控制流。本文说明 panic、defer、recover 与 error 的职责边界,以及如何只在明确边界处恢复并转换为错误。155 收藏 -
Zap 的 AddCallerSkip 不是修改日志内容,而是调整调用位置计算时跳过的栈帧数量。本文用包装器层数解释 skip 偏小、偏大和重构后的归因风险,并给出集中配置方式。155 收藏 -
Go 泛型约束写了具体类型,却不代表类型参数拥有该类型的全部方法。本文从类型集、方法集和接口约束的边界出发,解释常见编译错误,给出可运行的修复写法,并说明什么时候该把行为写进约束。154 收藏 -
用 Go 的 slog.LogValuer 控制日志字段的延迟求值与脱敏,厘清日志级别过滤、LogValue、slog.String 和 slog.Group 的调用边界。154 收藏 -
Go 1.24 的 strings.SplitSeq 返回单次消费的字符串迭代器,适合只遍历不保存结果的场景。本文对比 strings.Split 与 SplitSeq 的消费方式,核对连续分隔符、空字符串和提前 break 等边界。154 收藏 -
Go 中 os.Rename 在同一文件系统里适合做临时文件提交,但跨文件系统时可能返回 invalid cross-device link。本文从错误现场出发,写出可检查、可回退、不会把半成品当正式文件的保存流程。154 收藏 -
使用一个 Go log.Logger 统一格式,再通过 io.MultiWriter 同时写入标准输出和文件;本文还说明写入错误短路、并发安全与 Close 生命周期边界。154 收藏 -
讲清 bytes.Buffer 处理分段响应时 Len、Cap、Grow、Reset 和 Bytes 的边界,给出复用同一缓冲区、复制别名数据和隔离并发请求的实战写法。154 收藏 -
解释 Go database/sql 中 Tx.Stmt 复用 DB 级预处理语句时的对象归属、事务绑定、关闭责任、上下文与并发边界。154 收藏 -
Go 收到信号后仍不退出,要区分通知送达、工作取消与 main 生命周期。本文说明缓冲信号通道、NotifyContext、stop、完成回执及有界等待,给出 Linux/macOS 的完整示例并明确超时退出的清理代价。154 收藏 -
Go 的 encoding/csv.Reader 不会自动移除文件开头的 UTF-8 BOM,首个字段可能因此多出不可见字节。本文用流式包装只检查前三个字节,说明如何保留普通文件、处理短输入并继续使用字段数检查。154 收藏 -
Go range 遍历结构体切片时,第二个变量通常是当前元素的值拷贝,修改它不会写回原切片。本文用最小示例说明原因,并给出按索引写回、只读值变量和指针切片三种选择。154 收藏 -
用 Go 1.24+ 的 os.OpenInRoot 在固定目录内打开外部传入文件名,理解 ..、绝对路径、符号链接、错误处理和版本边界,避免把 filepath.Join 当成安全隔离。154 收藏 -
Go text/template.ParseFiles 按文件基名建立模板名称,包级调用的根模板取第一个文件,方法调用还要注意 New 名称与 Execute 的关系。本文用多文件、同名覆盖和 ExecuteTemplate 示例固定调用边界。154 收藏 -
讲清 Go bufio.Reader.ReadByte 的 byte、error 返回约定,演示如何区分有效字节、io.EOF 与其他读取错误,并处理缓冲状态和 UnreadByte 边界。154 收藏