json.Marshalでポインタ型フィールドだったら、そのポインタが指し示す先をいい感じに引っ張ってきてくれる理由
例えば以下のようなコードがあったとして、
code:go
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string
Age int
Email *string
}
func main() {
email := "ryota@example.com"
person := Person{
Name: "Ryota",
Age: 26,
Email: &email,
}
// Person構造体をJSONに変換する
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("JSON encoding error:", err)
return
}
fmt.Println(string(jsonData))
}
出力結果は以下のようになる。Emailフィールドはポインタ型だが、よしなにポインタが指し示す先を見てアウトプットしてくれる。
code:shell
{"Name":"Ryota","Age":26,"Email":"ryota@example.com"}
どうして、ポインタ型のときにこのような挙動になるのかソースコードを確かめる。
結論としては、リフレクションでポインタ型だったら、それが指し示す先の値をreflectionのElem()で見るようになっていた。
該当のソースコードは以下。
https://scrapbox.io/files/667a5ce1706bb5001dbbf816.png
https://scrapbox.io/files/667a5cfb706bb5001dbbfa38.png