2015-07-03 4 views
-1

У меня есть структура с некоторыми полями внутри и я Маршалл, что структура и возврат json to client. I cannot change json nor structure, но в некоторых случаях я должен добавить еще один дополнительный флаг. Возможно, instance monkey patching в Go и как достичь этого? Я могу решить это через наследование, но мне бы хотелось увидеть, возможно ли динамическое добавление свойства к экземпляру структуры в Go.Экземпляр исправления обезьяны в Go

ответ

4

Нет, вы не можете обезвреживать такие вещи, как в Go. Структуры определены во время компиляции, вы не можете добавлять поля во время выполнения.

я могу решить эту проблему путем наследования (...)

Нет, вы не можете, потому что нет наследования в Go. Вы можете решить эту проблему с помощью композиции:

type FooWithFlag struct { 
    Foo 
    Flag bool 
} 
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 
} 

playground