猿问

Go 中的 Monkey 补丁实例

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


繁星点点滴滴
浏览 153回答 3
3回答

HUWWW

不,你不能在 Go 中对这样的东西进行猴子补丁。结构在编译时定义,您不能在运行时添加字段。我可以通过继承来解决这个问题(...)不,你不能,因为 Go 中没有继承。您可以通过组合解决它:type FooWithFlag struct {    Foo    Flag bool}

潇湘沐

你总是可以定义一个自定义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}
随时随地看视频慕课网APP

相关分类

Go
我要回答