json.RawMessage - это []byte; при Unmarshal в него сохраняются сырые байты JSON без разбора. Удобно для отложенного парсинга или для полей с динамической структурой (например, payload события). При Marshal RawMessage выводится как вложенный JSON. Используют в обертках над событиями и в API с гибким телом.
type Event struct {
Type string // json:"type"
Data json.RawMessage // json:"data"
}
var e Event
json.Unmarshal(input, &e)
switch e.Type {
case "user": var u User; json.Unmarshal(e.Data, &u)
}