Go问答技术文章
-
Golang · Go问答 | 4星期前 | go语言 · 接口设计 · Go问答 · 兼容性 · encoding/json 接口兼容 DisallowUnknownFields RawMessage Go JSON 未知字段
Go 的 JSON 接口如果既要兼容带新增字段的旧客户端,又要知道协议发生了什么变化,可以先正常解码结构体,再用 map[string]json.RawMessage 读取字段名并比较白名单,最后将未知字段作为可审计告警,而不是直接拒绝请求。482 收藏 -
Go 的 encoding/json 将数字解码到 interface{} 时默认使用 float64。本文从类型断言失败和大整数精度风险出发,说明 UseNumber、json.Number 与具体结构体的选择。260 收藏 -
Go 使用 json.Decoder 时,io.EOF 通常表示输入流已经正常结束,不等于 JSON 格式错误。本文用代码区分 EOF、空输入、UnexpectedEOF 和真正语法错误。444 收藏 -
Go 的 type assertion 失败可能来自 nil 接口或动态类型不匹配,携带 nil 指针的接口又是另一种状态。本文用 comma-ok、nil 判断和类型 switch 说明如何安全区分并处理这三类输入。152 收藏 -
Go 中两个 error 的 Error 文本相同,接口值仍可能不相等。本文解释动态类型和值的比较规则,并用 sentinel、errors.Is、errors.As 给出稳定的错误判断方式。461 收藏 -
Go 中把 nil 指针放进接口后,接口本身可能不等于 nil,但方法仍可依据动态类型完成分派。本文用最小示例拆开 nil 接口、typed nil 和 nil 接收者的区别。399 收藏 -
Go build 报头文件找不到时,不要先盲目改路径。按 CGO_ENABLED、CC/CXX、头文件搜索路径和 pkg-config 四层检查,通常可以快速定位 cgo 构建边界。393 收藏 -
Go 遇到 import cycle not allowed 时,关键不是搬文件,而是拆开包依赖环。本文用 checkout、payment 和 PaymentGateway 示例说明接口归属、隐式实现、组合根注入及 go list 排查方法。398 收藏 -
Go 中目录名与 package 名不一致通常不会直接导致 import 失败:import path 负责定位目录,package 声明决定默认调用前缀。本文用最小结构拆解 undefined、路径错误和同目录多包名问题,并给出显式别名与 go list 排查方法。497 收藏 -
Go 项目已经生成 vendor,编译却仍访问模块代理,通常不是 vendor 目录失效,而是 -mod 参数、GOFLAGS、go.mod 版本门槛或 vendor/modules.txt 不一致。本文按检查顺序给出定位和修复方法。433 收藏 -
Go mod tidy 移除本地 replace 依赖,通常不是本地模块不支持,而是 replace 没有对应 require、模块路径不匹配或代码已不再导入。本文用模块图、go.mod 边界和 tidy -diff 给出排查与修复方法。266 收藏 -
Go mod tidy 后出现 // indirect 不一定是多余依赖。本文从传递依赖、测试与构建条件三个入口排查来源,并用 go mod why、go mod graph 和 -diff 安全确认是否应该保留。424 收藏 -
Go 的 json.UnmarshalJSON 只负责输入解析,不能改变 omitempty 的输出规则。默认 encoding/json 中,零值结构体仍是可编码对象;要隐藏可选嵌套对象,应使用 nil 指针,并按接口契约区分缺失、空对象和显式零值。261 收藏 -
Go 处理事件 JSON 时,json.RawMessage 适合保留结构可变或低频使用的 payload,先读取 kind,再按分支解码到具体结构体,避免 map[string]any 带来的类型丢失。420 收藏 -
Go 实现 UnmarshalJSON 时直接调用 json.Unmarshal 会递归。本文用定义类型切断方法集,再补上错误处理、业务校验和嵌套字段边界。464 收藏