何に苦しんだかと言いますと

type Hoge struct {
   ID *json.RawMessage `json:"id"`
}

こう言う構造体を作った後で、json.Marshal をしようとしたら

json: error calling MarshalJSON for type *json.RawMessage: invalid character 'j' looking for beginning of value

こう言う始まりがおかしいぜBoy!!って怒られた話

大体の記事とかでは

j := json.RawMessage(`"無駄無駄無駄無駄無駄"`)

ッて感じで書かれてると思うんだけど、実際開発していくと、値は変数(文字列)を使いたいケースが多いと思うんだ

func hoge(val string) *json.RawMessage {
}

的な感じで、hoge(“オラオラオラ”) って渡せればいいけど、直接値を書くことはほぼなく、処理の中で渡ってきた値を使う事がおおいかと そうなると

hoge(val)

となるよね….

func hoge(val string) *json.RawMessage {
return &json.RawMessage(val) //&json.RawMessage("あたい")
}

となると、このような感じで動かすことになって、結果エラル

色々悩んだ末

func hoge(val string) *json.RawMessage {
return &json.RawMessage(fmt.Sprintf(`%q`, val)) //&json.RawMessage(`"あたい"`)
}

フォーマットで %qをつかえば解決したよって話なんだけど、、、これで良かったのか今でも悩んでます。
深夜のテンションなので、もう適当に書きました。

%q は、文字列なら”“も一緒に出力してくれるやーつ(簡単に言うと)

検証用に書いた、プレイグラウンド https://play.golang.org/p/Bp6jKUVnZ4