Go语言技术文章
-
Go 的 url.Values.Encode 会按 key 排序,重复 key 的值保持切片顺序;如果接口或签名要求自定义顺序,就要用有序 key 列表显式拼接。本文给出默认规则、编码边界和可复用写法。139 收藏 -
用 Go io/fs 的 fs.Sub 把目录映射成独立的 FS 视图,配合 WalkDir 和 ReadFile 处理相对路径,并厘清非法路径、缺失目录与符号链接安全边界。139 收藏 -
reflect.Value.IsZero 判断的是类型零值,time.Time.IsZero 判断的是零时间点。本文拆开值、指针和接口字段的反射入口,给出避免时间字段误判的写法与检查清单。138 收藏 -
Golang · Go问答 | 3天前 | 基准测试 · Go问答 · Go string []byte map key Go map key 分配 string 转 []byte 性能 Go AllocsPerRun Go map 性能评估
Go 的 []byte 不能直接作为 map key。本文拆分 string 转换、map 查找和写入三个成本,用 AllocsPerRun 与基准测试建立可复用的分配评估方法。137 收藏 -
Go 上传接口要限制请求体,应该在 Handler 入口用 http.MaxBytesReader 包住 r.Body,再用 errors.As 识别 *http.MaxBytesError 并返回 413。本文还区分 Content-Length 预检查与 multipart 的 maxMemory。134 收藏 -
Go 的接口类型可以参与比较,但接口里装入 slice、map 或 func 等不可比较动态值时,直接比较可能触发 panic。本文用 reflect.Type.Comparable 判断动态类型的类型级条件,再处理 nil、动态类型不同和 NaN 等边界,最后比较反射、泛型约束与业务键设计的适用场景。134 收藏 -
strings.ToValidUTF8 能把非法 UTF-8 清洗成合法字符串,但替换长度可能改变后续字节偏移。本文用 DecodeRuneInString 记录原始错误区间,并给出偏移敏感场景的等长替换方案。132 收藏 -
Go 泛型函数不能把 nil 直接返回为任意 T。本文区分类型参数零值与具体可空类型,给出 zero、nilPtr、nilSlice 的写法,并解释无普通实参时为何要显式补全类型参数。132 收藏 -
用 Go httptest.NewServer 构造一个可控的本地 HTTP 服务,把真实上游替换成固定 Handler,再围绕请求路径、请求头、状态码和响应体组织稳定测试。132 收藏 -
通过 httptest.NewServer 与自定义 RoundTripper 组合,记录测试客户端请求,并稳定覆盖固定 500 响应和传输错误分支。132 收藏 -
读多写少不等于一定该用 sync.RWMutex。本文从读临界区、写者等待、锁升级限制和实际基准四个角度,说明如何在 Mutex 与 RWMutex 之间做出可验证的选择。131 收藏 -
Go TestMain 没有 error 返回值,初始化失败时应先清理已创建资源,再用 os.Exit(1) 明确阻断测试;初始化成功则保存 m.Run 的退出码,清理后原样返回。130 收藏 -
Go 自定义错误只实现 Error() 时,errors.Is 可能无法匹配底层错误或业务哨兵。本文区分 Unwrap、Is 与 As,并给出错误链、语义匹配和常见坑的处理方法。130 收藏 -
解释 Go 循环中 defer 为什么会让资源和内存峰值随迭代数增长,并用小函数边界改写为每轮及时清理。129 收藏 -
Go 泛型函数通常从调用实参建立类型关系,不能只凭接收变量的类型逆向猜出返回值中的类型参数。本文用最小示例解释推断边界,并给出显式实例化、增加输入参数和非泛型包装三种改法。128 收藏