Marshalling json.RawMessage возвращает строку с кодировкой base64

Я запускаю следующий код:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(raw)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  
}

Игровая площадка: http://play.golang.org/p/qbkEIZRTPQ

Вывод:

"eyJmb28iOiJiYXIifQ=="

Желаемый вывод:

{"foo":"bar"}

Почему base64 кодирует мой RawMessage, как если бы он был обычным []byte?

В конце концов, реализация RawMessage MarshalJSON просто возвращает байтовый фрагмент

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil 
}

Ответ 1

Нашел ответ в потоке go-nuts

Значение, переданное в json.Marshal, должно быть указателем на json.RawMessage для правильной работы:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(&raw)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  
}