У меня есть структура с некоторыми полями внутри и я Маршалл, что структура и возврат json to client
. I cannot change json nor structure
, но в некоторых случаях я должен добавить еще один дополнительный флаг. Возможно, instance monkey patching
в Go и как достичь этого? Я могу решить это через наследование, но мне бы хотелось увидеть, возможно ли динамическое добавление свойства к экземпляру структуры в Go.Экземпляр исправления обезьяны в Go
-1
A
ответ
4
Нет, вы не можете обезвреживать такие вещи, как в Go. Структуры определены во время компиляции, вы не можете добавлять поля во время выполнения.
я могу решить эту проблему путем наследования (...)
Нет, вы не можете, потому что нет наследования в Go. Вы можете решить эту проблему с помощью композиции:
type FooWithFlag struct {
Foo
Flag bool
}
0
вы можете также использовать опцию json:",omitempty"
на вашем флаге
пример:
1
Вы всегда можете определить пользовательские 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
}