Go语言技术文章
-
Go 多个发送方共享 channel 时,接收方无法判断所有发送是否结束,贸然 close 会与发送竞争并触发 panic。本文给出 WaitGroup 唯一关闭者与 context 取消写法。173 收藏 -
strings.Fields 适合按空白切分普通文本,却不能把带引号的命令参数当成一个整体。本文从文件名带空格的真实输入出发,比较 Fields、简单状态机和标准库参数解析的边界,并用表驱动测试固定转义行为。172 收藏 -
Go 1.27 的 encoding/json/v1 已由 v2 实现支撑。本文解释如何用 DefaultOptionsV1 建立兼容基线,再逐项切换字段匹配、omitempty、nil 容器和重复字段等语义,降低一次性迁移风险。172 收藏 -
Go 的 os.File.Close 会返回 error。本文按文件用途和错误阶段说明什么时候必须返回、什么时候可记录,并给出同时处理 Write、Flush、Close 的写法。172 收藏 -
filepath.WalkDir 中 fs.SkipDir 是跳过目录的控制信号,普通非 nil error 才会终止整棵目录树;文件节点返回 SkipDir 还会影响其父目录。172 收藏 -
Go 中的 assert 通常指接口类型断言。本文比较单值断言、逗号 ok 和 type switch,说明动态类型读取、失败处理以及 nil 边界。172 收藏 -
Go html/template 把 href 中的 URL 改成 & 或 #ZgotmplZ,并不一定是链接坏了。本文用一个最小页面拆开 HTML 实体、URL 过滤、协议判断和受信 URL 类型的边界。172 收藏 -
Go channel 消费者无法退出时,先用 goroutine profile 找阻塞栈,再用 Context 补取消分支,并按 channel 所有权选择关闭责任。171 收藏 -
用 Go 的 encoding/csv 逐条读取大文件,处理固定或可变列数,记录 ParseError 的真实行列信息,并说明 ReadAll、ReuseRecord 和 LazyQuotes 的取舍。171 收藏 -
Go 使用 bufio.Writer 时,Write 成功不代表底层写入完成。本文解释 Flush 为什么是最终错误边界,并给出把 Flush 错误稳定返回调用方的写法。171 收藏 -
使用 slices.Delete 删除切片区间时,关键是接收返回值、理解原地搬移和尾部清零,并根据元素是否含指针处理底层引用与批量删除边界。171 收藏 -
解释 Go database/sql 中 Rows.Next 返回 false 的双重语义,给出 Next、Scan、Err、Close 的正确组合,并说明如何避免迭代失败时静默返回半截数据。171 收藏 -
Go 接口升级时,既要识别未知字段避免拼写错误,又要保留新字段以兼容旧客户端。本文用 Decoder、DisallowUnknownFields 和 json.RawMessage 拆开这条边界。170 收藏 -
netip.ParseAddr 失败时返回的是无效 Addr 和可诊断的错误,不能只靠 Addr{} 判断输入问题。本文用最小 Go 示例拆开 IPv4、IPv6、空字符串和带区域标识的边界,并给出服务端校验时可复用的判断顺序。170 收藏 -
Go 1.20 的 context.WithCancelCause 可以把具体错误随取消信号传给下游。本文区分 ctx.Err() 与 context.Cause(ctx),说明首个取消原因、父子 Context 传播和常见误用。170 收藏