Go问答技术文章
-
Go 的 json.UnmarshalJSON 只负责输入解析,不能改变 omitempty 的输出规则。默认 encoding/json 中,零值结构体仍是可编码对象;要隐藏可选嵌套对象,应使用 nil 指针,并按接口契约区分缺失、空对象和显式零值。261 收藏 -
Go 处理事件 JSON 时,json.RawMessage 适合保留结构可变或低频使用的 payload,先读取 kind,再按分支解码到具体结构体,避免 map[string]any 带来的类型丢失。420 收藏 -
Go 实现 UnmarshalJSON 时直接调用 json.Unmarshal 会递归。本文用定义类型切断方法集,再补上错误处理、业务校验和嵌套字段边界。464 收藏 -
Go 中自定义 RoundTripper 时,不要用空的 http.Transport 替换默认传输层。本文说明如何通过类型断言和 Clone 保留 ProxyFromEnvironment、连接复用与响应体边界。401 收藏 -
Go http.Transport 设置 DisableKeepAlives 后吞吐下降,通常是连接复用被关闭,重复承担建连、TLS 握手和连接调度成本。本文解释它与 TCP keepalive 的区别,并给出复用、限额和清理空闲连接的配置取舍。350 收藏 -
讲清 Go http.Transport 的 IdleConnTimeout 如何按 keep-alive 空闲时长回收连接,并区分连接数量、响应头等待、请求总超时和主动清理。396 收藏 -
Go 服务端 Handler 通常不需要手动关闭 http.Request.Body,HTTP Server 会在请求结束时负责收尾;真正必须由调用方关闭的是客户端 Response.Body。本文按生命周期拆开这两个容易混淆的责任边界。387 收藏 -
Go 的 http.Request.GetBody 不是所有请求都会自动生成,只有客户端 NewRequest 识别的标准 reader 才会填充。本文区分客户端与服务端边界,并给出自定义 Body 的安全重放写法。212 收藏 -
Go 服务端中间件读取 http.Request Body 后,下游为什么只能拿到空内容?关键在于 Body 是一次性读取流,读取后要用缓存字节重建 Request.Body,并同时控制请求体大小与错误分支。484 收藏 -
Go 的 embed 在编译期读取资源;交叉编译不会自动改写同一文件,平台差异应通过构建约束选择不同源文件。168 收藏 -
交叉编译后不要只看构建机上的 GOOS 和 GOARCH。本文用 go env、文件格式、go version -m 和 build ID 四层证据,确认最终二进制实际面向的操作系统与 CPU 架构。396 收藏 -
设置 GOOS 和 GOARCH 只改变 Go 的目标平台,不会自动提供目标平台的 C 编译器、头文件和库。本文按 cgo 开关、CC 工具链、编译与链接错误四层排查交叉构建失败。351 收藏 -
用 *_test.go 保存普通测试,用 integration 或 e2e 标签隔离数据库、消息队列和外部服务测试;本文说明标签写法、默认命令、集成命令与 go list 排查方法。262 收藏 -
迁移 Go 构建约束时,//go:build 与 // +build 必须表达同一条件;理解空格、逗号和多行的逻辑,再用 gofmt、go vet 和跨平台构建检查结果。496 收藏 -
Go build tags 同时写平台和自定义条件时,文件未被选中通常不是 go build 失效,而是 &&、||、-tags 传值或文件名隐式约束叠加后的结果。本文用 go list 逐层排查。386 收藏