Go语言技术文章
-
Go 的 url.Values 会在 Encode 阶段统一转义查询参数。本文从重复编码现象出发,说明如何保留原始值、处理已有查询、识别外部已编码输入,并区分查询参数与路径转义。147 收藏 -
Go database/sql 中 rows.Next 返回 false 不一定代表结果正常读完,也可能是驱动在迭代阶段返回了错误。本文用原创读取模板拆开 Query、Scan、Close 和 Rows.Err 的职责,并说明多结果集与写入型结果集的处理边界。146 收藏 -
Go 的 os.ReadDir 默认按文件名返回目录项;如果业务还要按修改时间排序,应先读取 DirEntry.Info,再用稳定排序保留文件名作为平局规则。本文给出可直接改造的实现和错误处理边界。143 收藏 -
多个 Go 生产者共享 channel 时,由唯一协调者等待全部发送者退出后关闭输出。本文给出原创实现、固定负载基准入口,以及正常计数和取消收尾的观测边界。141 收藏 -
Go embed FS 资源加载失败时,保留逻辑资源名、失败阶段与底层错误链。小项目区分非法路径、资源不存在和模板解析错误,说明 ValidPath 不保证存在。141 收藏 -
Go 泛型函数把类型参数放进 map[K]V 时,应使用 K comparable 表达键的比较边界。本文用可复用查找函数说明字符串、整数和结构体键的适用范围,并区分 comparable 与排序、加法、业务方法约束。140 收藏 -
Go 接口只有动态类型和动态值同时为空时才等于 nil。把值为 nil 的具体指针返回给 error,会让接口携带该指针类型,从而出现 err != nil。本文用最小示例说明原因、观察方法和正确修复方式。140 收藏 -
Go 用 fmt.Errorf 增加错误上下文时,应使用 %w 保留底层错误链,再交给 errors.Is 或 errors.As 判断;本文从常见误区出发,说明 %v 与 %w、单层和多层包装、nil 边界以及服务层返回约定。136 收藏 -
Golang · Go教程 | 2天前 | 日志 · HTTP · go · Context · slog · 可观测性 · Go context.Context 结构化日志 请求日志 log/slog slog.Logger
Go 的 log/slog 不会把 context.Context 中的值自动变成日志字段。更稳妥的做法是在 HTTP 入口用 Logger.With 固定 request_id、method、path 等请求属性,再把 context.Context 和这个 Logger 显式传给下游,并在需要时使用 InfoContext 或 LogAttrs。136 收藏 -
Go 的 interface 类型可以比较,但其中保存的动态值不一定可比较。本文从 panic 现场解释 slice、map、func 等类型为何触发运行时错误,并给出 reflect.Value.Comparable、类型断言和业务键比较的安全方案。136 收藏 -
用 tview Pages 保留主界面并叠加 Modal,结合完整示例说明确认、取消、Esc、移除临时页和焦点恢复,对比隐藏复用与移除重建的生命周期取舍。135 收藏 -
Go sqlmock 适合锁定 SQL 调用、参数和事务契约,真实数据库测试则负责发现方言、模式、约束、索引与事务环境问题。本文用一张边界表说明两者各自能发现什么,以及如何组合回归。135 收藏 -
Go 表驱动测试调用 t.Parallel 后,闭包捕获的用例值和共享切片、map 可能互相污染。本文说明如何复制当前用例、隔离可变夹具,并用 go vet 与 -race 找到剩余风险。135 收藏 -
Go 的 json.Decoder 可以从 io.Reader 连续读取多个顶层 JSON 值。本文区分单对象、空白分隔对象流和 JSON 数组,给出 EOF 边界、错误处理与可复用读取函数的设计方式。134 收藏 -
在 Go sqlmock 查询期望上配置 RowsWillBeClosed,并在函数返回后检查 ExpectationsWereMet。本文用提前返回的最小测试说明结果集关闭、自动关闭边界及资源责任的排查方法。133 收藏