Go语言技术文章
-
Go 1.23 引入的 iter.Seq 让 slices.Chunk 可以惰性提供批次,slices.Collect 再把序列接收为可索引切片。本文说明空序列、尾批次和 slices.Clone 的数据所有权边界。144 收藏 -
Go 的 encoding/json 默认会忽略结构体未声明的 JSON 字段。本文用 Decoder.DisallowUnknownFields 在请求边界拒绝拼写错误,说明 json 标签、嵌套结构、单文档尾部检查和可演进事件的取舍。144 收藏 -
Go compress/gzip 的 Name 与 Comment 属于 gzip 文件头元数据,需要在首次 Write、Flush 或 Close 之前设置。本文说明字段职责、编码限制、读取方式以及复用 Writer 时的重置顺序。144 收藏 -
http.Client.Timeout 的零值表示不设总超时,因此请求可能一直等待连接、响应头或响应体。本文用一个可解释的请求预算说明根因、修复写法和阶段边界。144 收藏 -
需要确认 Go 当前是否带有编译实验开关时,先用 go env GOEXPERIMENT 查看有效配置。本文区分空值、显式实验名、none 与无效值,并说明 GOEXPERIMENT 的工具链开发边界。144 收藏 -
Go gopacket可通过LayerTypeTCP查询已有数据包,再受检断言为TCP层。本文给出完整离线示例,区分非TCP、解码错误和有效字段,并说明解码起点与负载生命周期。144 收藏 -
Go 1.25 的 net/http 新增 CrossOriginProtection,本文从浏览器请求边界、Handler 接入、可信来源配置和 403 验收入手,拆解它适合解决什么问题以及哪些请求不能误放行。143 收藏 -
json.RawMessage 适合把 JSON 解码延后,但 MarshalJSON 与 UnmarshalJSON 的字节所有权规则不同。本文用最小代码说明何时会复制、何时只是复用已有字节,以及如何避免修改底层切片带来的隐蔽问题。143 收藏 -
fs.WalkDir 面向抽象文件系统,filepath.WalkDir 面向本机文件路径;两者共享 DirEntry 回调,却在路径格式、数据来源和测试方式上有关键差异。本文用同一项目录扫描任务拆开选择边界,并给出可验证的代码写法。143 收藏 -
Go 1.26 放开了泛型类型在类型参数列表中的自引用。用 Adder[A] 拆解类型集合、方法集合与实例化边界,分清普通接口实现和泛型方法,最后给出最小编译检查清单。143 收藏 -
crypto/rand.Read 的契约是填满目标切片。本文说明如何处理长度判断、自定义 io.Reader 的短读、io.ReadFull 以及固定长度随机令牌的业务边界。143 收藏 -
Go 的 string 可以携带任意字节,协议入口不能仅凭类型就认为它是合法文本。本文用 unicode/utf8.ValidString 区分完整 UTF-8、截断序列和业务上不允许的内容,并给出拒绝与记录的落地写法。143 收藏 -
bufio.Writer 会把第一次底层写入错误保存在内部,后续 Write 和 Flush 都返回这项粘性错误。本文说明部分写入、io.ErrShortWrite、Reset 与安全重试的边界。143 收藏 -
gif.EncodeAll 要求 Image、Delay 与非 nil Disposal 按帧对齐。本文给出严格检查、同步筛帧和受控补齐的安全写法。143 收藏 -
Go 1.22 起可以直接用 zip.Writer.AddFS 把 fs.FS 目录树写入 ZIP。本文说明 os.DirFS、fs.Sub、路径前缀、非普通文件和 Writer.Close 的关键边界。143 收藏