Go语言技术文章
-
Go 1.23 的 unique.Make 可以把可比较值规范化为可廉价比较的 Handle,但它不是无条件的字符串驻留池。本文从标签解析缓存场景出发,拆开 Make、Handle、Value 和垃圾回收之间的关系,说明何时值得用、如何保留句柄,以及为什么不能只存 Value。483 收藏 -
strings.Builder 适合高效拼接字符串,但写入后复制会触发运行时检查。本文从零值使用、复制边界和返回字符串的别名风险说明正确写法。483 收藏 -
Go 处理用户上传目录或解压目录时,os.Root 可以把文件访问限制在一个根目录内。本文从 Open、ReadFile 和相对路径校验入手,说明目录沙箱如何工作、哪些错误必须保留,以及如何验证越界路径不会被打开。483 收藏 -
Go 的 regexp.ReplaceAllStringFunc 会把每个完整匹配交给回调,再用回调返回值直接替换。本文用环境标记、标签规范化和版本脱敏说明动态替换、捕获组边界及 API 选择。483 收藏 -
Go TLS 配置 MinVersion 后旧客户端无法连接,通常是双方允许的协议版本没有交集。本文用版本范围、握手错误和 ConnectionState 说明如何定位,并给出兼容策略。483 收藏 -
用一个共享 map 的最小测试复现 Go 并发读写竞态,说明 go test -race 的触发边界,并用 sync.RWMutex 收拢修复方案。483 收藏 -
解释 Go //go:embed 为什么在目录递归时排除以点号或下划线开头的文件,比较目录名、当前层通配符与 all: 前缀的差异,并给出精确嵌入、结果检查和安全边界。483 收藏 -
http.Header.Get 找不到请求头和请求头值为空时都会返回空字符串。本文用 http.Header、Header.Get 与逗号 ok 判断拆开这两个状态,并给出适合接口校验的写法。482 收藏 -
Go 的 HTTP 客户端连接池关键不在于每次请求都新建 Client,而在于长期复用同一个 Transport,并分别理解空闲连接、主机总连接和空闲回收时间。本文给出可直接改造的配置与边界。482 收藏 -
Go 的 map 读取不存在的键时不会报错,而是返回元素类型的零值。本文用具体代码解释单值读取、comma-ok、nil map 与写入 panic 的边界。482 收藏 -
Golang · Go问答 | 3星期前 | go语言 · 接口设计 · Go问答 · 兼容性 · encoding/json 接口兼容 DisallowUnknownFields RawMessage Go JSON 未知字段
Go 的 JSON 接口如果既要兼容带新增字段的旧客户端,又要知道协议发生了什么变化,可以先正常解码结构体,再用 map[string]json.RawMessage 读取字段名并比较白名单,最后将未知字段作为可审计告警,而不是直接拒绝请求。482 收藏 -
Go 中用 os.OpenFile 创建唯一文件时,O_EXCL 必须和 O_CREATE 一起使用。本文给出错误判断、关闭处理与并发验收指标,避免已有文件被覆盖或截断。482 收藏 -
用 Go hash.Hash 和固定缓冲区流式计算文件摘要,覆盖部分读取、EOF、真实 I/O 错误、资源关闭与摘要输出边界。482 收藏 -
在文件节点返回 fs.SkipDir 会跳过父目录剩余条目,fs.SkipAll 则停止整棵树。本文用对照表和代码说明安全选择边界。482 收藏 -
Go 用 httptest 写 Handler 单测时,常见现象是状态码为 0、响应头没生效,或读到的响应体为空。关键是区分 ResponseRecorder 的记录时机、WriteHeader 的提交边界,以及 Result 必须在 Handler 返回后再读取。文中给出可复用的最小测试和复查清单。481 收藏