Go语言技术文章
-
Go 服务端中间件读取 http.Request Body 后,下游为什么只能拿到空内容?关键在于 Body 是一次性读取流,读取后要用缓存字节重建 Request.Body,并同时控制请求体大小与错误分支。484 收藏 -
Golang · Go教程 | 2天前 | 性能优化 · Go教程 · net/http · 兼容性 · Preload Go net/http ErrNotSupported http.Pusher HTTP/2 Server Push Early Hints
Go 的 http.Pusher 仍可探测,但 Push 在客户端禁用或连接不支持时会返回 ErrNotSupported。更稳的资源加载方案是以最终 HTML 为主,按首屏预算组合 preload 与 103 Early Hints,把 Push 降级为可选加速。484 收藏 -
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 收藏 -
http.Header.Get 找不到请求头和请求头值为空时都会返回空字符串。本文用 http.Header、Header.Get 与逗号 ok 判断拆开这两个状态,并给出适合接口校验的写法。482 收藏 -
Go 的 HTTP 客户端连接池关键不在于每次请求都新建 Client,而在于长期复用同一个 Transport,并分别理解空闲连接、主机总连接和空闲回收时间。本文给出可直接改造的配置与边界。482 收藏 -
Go 的 map 读取不存在的键时不会报错,而是返回元素类型的零值。本文用具体代码解释单值读取、comma-ok、nil map 与写入 panic 的边界。482 收藏 -
Golang · Go问答 | 5天前 | go语言 · 接口设计 · Go问答 · 兼容性 · encoding/json 接口兼容 DisallowUnknownFields RawMessage Go JSON 未知字段
Go 的 JSON 接口如果既要兼容带新增字段的旧客户端,又要知道协议发生了什么变化,可以先正常解码结构体,再用 map[string]json.RawMessage 读取字段名并比较白名单,最后将未知字段作为可审计告警,而不是直接拒绝请求。482 收藏 -
Go 中用 os.OpenFile 创建唯一文件时,O_EXCL 必须和 O_CREATE 一起使用。本文给出错误判断、关闭处理与并发验收指标,避免已有文件被覆盖或截断。482 收藏 -
用 pkg.go.dev API 读取 Go 包、模块和版本元数据,处理路径歧义、构建上下文与分页,并划清目录数据和本地构建验证的边界。481 收藏 -
多模块 Go 仓库里,go test ./... 只覆盖当前模块并不一定是测试失效。本文从 go.work、use、replace 和模块边界入手,给出补齐工作区并逐模块测试的实用做法。481 收藏 -
Go 接口类型本身支持比较,但接口里的动态值如果是 slice、map、func,或包含这些字段的数组和结构体,比较相同动态类型的两个接口就可能触发 panic。本文说明判断边界,并给出 reflect.Value.Comparable、reflect.DeepEqual 和类型化比较的选择方法。481 收藏