You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言自定义MarshalJSON值接收器引发栈溢出问题咨询

为什么值接收器的MarshalJSON会导致栈溢出?

问题根源:无限递归调用

当使用值接收器实现Role的MarshalJSON方法时,执行流程会陷入无限递归:

  1. 调用json.Marshal(r.Values())时,Values()返回的切片中每个map都包含"id": m(m是Role类型的值)。
  2. JSON序列化器处理Role类型的m时,会触发Role的自定义MarshalJSON方法。
  3. 这个方法又会再次调用json.Marshal(r.Values()),循环往复导致栈溢出。

指针接收器为何能正常运行?

把接收器改为*Role后,逻辑发生了关键变化:

  • 此时只有指针类型*Role拥有自定义的MarshalJSON方法,值类型Role本身不再绑定这个方法。
  • Values()里的m是Role值,JSON序列化器会将其当作底层的uint64类型处理,不会触发自定义序列化逻辑,自然不会产生递归调用,也就避免了栈溢出问题。

补充说明

你之前的认知没错,MarshalJSON确实支持值接收器,但你的实现逻辑在值接收器场景下触发了无限递归,这才是问题的核心,而非接收器类型本身的必要性。

内容的提问来源于stack exchange,提问作者xrfang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:17:09