Go教程技术文章
-
Go 1.27 让 go test 默认启用 stdversion 检查,用来发现代码使用了高于 go.mod 版本的标准库符号。本文从报错定位开始,说明 go.mod、构建标签和升级边界如何配合,并给出可复现的检查流程。339 收藏 -
Go 的 flag.FlagSet 适合把 start、stop、config 等子命令拆成彼此独立的参数集合。本文从参数隔离开始,说明 ContinueOnError、Usage、Parse 和错误码如何组合,并给出可运行的最小命令行程序。150 收藏 -
Go 反射中 CanSet 为 false 通常不是 Set 写错,而是 Value 没有可写地址,或字段受未导出规则保护。本文从 ValueOf、Elem 和结构体字段三个现场定位原因,并给出安全修改与检查方法。295 收藏 -
Go 1.23 的 slices.Collect 可以把 iter.Seq 收成新切片,但空序列返回 nil,消费过程也只发生一次。本文用过滤、提前停止和容量检查说明它的语义边界与使用方式。357 收藏 -
围绕 database/sql.Rows.NextResultSet 处理多结果集,讲清 Next、Scan、NextResultSet、Err 和 Close 的调用顺序,并用空结果集与驱动支持差异做实战核对。399 收藏 -
用 encoding/json.Decoder 的 InputOffset 和 SyntaxError.Offset 定位坏 JSON,区分字节偏移与字符位置,并给出流式解析、UTF-8 和错误行号的可复用处理方式。299 收藏 -
archive/tar 的 Header.Name 不能直接拼接到解压目录。本文从 tar 条目检查、filepath.IsLocal 与 Rel 校验入手,给出拒绝绝对路径和 .. 逃逸的 Go 示例,并补上符号链接、文件大小和失败回滚边界。489 收藏 -
Go 1.20 引入的 http.ResponseController 把 Flush、Hijack、读写超时和全双工读取统一到一个控制入口。本文用最小示例说明它如何工作、何时返回 ErrNotSupported,以及接管连接后必须承担哪些清理责任。186 收藏 -
后台任务最难排查的不是启动,而是失败后谁负责停下、错误如何回到请求方、剩余 goroutine 怎样确认已经退出。本文用 Go errgroup 组织并发任务,拆解退出信号、错误回收和最小验收方式。385 收藏 -
Go 1.25 继续完善 runtime.AddCleanup 的并发清理能力。本文从文件描述符这类外部资源出发,说明它与 SetFinalizer 的语义差异、必须保留的显式 Close,以及 GODEBUG 检查方式。368 收藏 -
用 Go http.ServeContent 提供音视频或大文件时,Range 请求返回 416 往往不是客户端故障,而是 Seek、文件大小和请求区间没有对上。本文用可复现的检查路径拆开 206 与 416 的边界。219 收藏 -
Go 的 crypto/rand 适合生成短期一次性令牌,但随机字节数、URL 安全编码和过期校验必须一起设计。本文用一个短期下载令牌示例说明熵预算、存储字段、校验顺序和常见误区。356 收藏 -
Go 的 O_APPEND 只把每次写入的起点交给内核保证,不等于整条日志天然不可交错,也不替日志轮转解决文件描述符和重命名边界。文章用可运行示例拆开偏移、并发写入和轮转后的处理方式。192 收藏 -
slog.LogValuer 可以把复杂对象转换成结构化日志值,但如果直接把令牌、邮箱或请求头塞进 Attr,日志脱敏就会失效。本文从 LogValue 的降级边界出发,演示组字段、零值和审计检查如何组合,避免调试信息变成敏感数据出口。403 收藏 -
bytes.Buffer 的 Grow 不是越大越好:它只保证后续写入有足够空间,Len 与 Cap 观察到的是不同维度。本文用请求拼装和最小测试说明如何估算容量、何时提前 Grow,以及如何验证扩容是否真的减少了分配。234 收藏