为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的 Monkey 补丁实例

Go 中的 Monkey 补丁实例

Go
繁星点点滴滴 2021-10-18 16:37:11
我的结构里面有一些字段,我把这个结构编组并返回json to client。我cannot change json nor structure但在某些极端情况下,我必须再添加一个额外的标志。instance monkey patching在 Go 中是否可行以及如何实现?我可以通过继承来解决这个问题,但我很想看看在 Go 中是否可以动态地向结构实例添加属性。
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

不,你不能在 Go 中对这样的东西进行猴子补丁。结构在编译时定义,您不能在运行时添加字段。


我可以通过继承来解决这个问题(...)


不,你不能,因为 Go 中没有继承。您可以通过组合解决它:


type FooWithFlag struct {

    Foo

    Flag bool

}


查看完整回答
反对 回复 2021-10-18
?
潇湘沐

TA贡献1816条经验 获得超6个赞

你总是可以定义一个自定义Marshaler/Unmarshaler接口并在你的类型中处理它:


type X struct {

    b bool

}


func (x *X) MarshalJSON() ([]byte, error) {

    out := map[string]interface{}{

        "b": x.b,

    }

    if x.b {

        out["other-custom-field"] = "42"

    }

    return json.Marshal(out)

}


func (x *X) UnmarshalJSON(b []byte) (err error) {

    var m map[string]interface{}

    if err = json.Unmarshal(b, &m); err != nil {

        return

    }

    x.b, _ = m["b"].(bool)

    if x.b {

        if v, ok := m["other-custom-field"].(string); ok {

            log.Printf("got a super secret value: %s", v)

        }

    }

    return

}


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信