質問: new(regexp.Regexp) fmt.Print("<") fmt.Print(reg) fmt.Println(">") } ``` 上記のような変数を宣言し、newキーワードでメモリ確保を実行して、変数にnewで確保したメモリの アドレスを取得使用としましたが 実行結果は ``` <0xc0000402d0> => *string <&{}> => *os.File <> => *regexp.Regexp ``` 上記のようになりました *string型の変数の中身がポインタアドレスなのは期待どおりなのですが、 それ以降の2つはなぜ、変数にポインタアドレスが保持されていないのでしょうか?
回答: ちゃんとポインタを表示できるように書けていません。 つまりポインタアドレスが保持されているのですが表示がポインタアドレスでは無くなっています。 以下の構造体にはStringメソッドが定義されていて、fmt.Printやfmt.Printlnに渡すとこれらのメソッドによって文字列化したものが表示されます。 * (*os.File).String() * (*regexp.Regexp).String() fmt.Printfの書式指定でポインタを表示する書式を使うか、 ポインタアドレスを数値に変換して表示する必要があります。 ``` package main import ( "fmt" "os" "regexp" ) func main() { var a *string = new(string) fmt.Print("<") fmt.Printf("%p", a) fmt.Println(">") var fp *os.File = new(os.File) fmt.Print("<") fmt.Printf("%p", fp) fmt.Println(">") var reg *regexp.Regexp = new(regexp.Regexp) fmt.Print("<") fmt.Printf("%p", reg) fmt.Println(">") } ``` というようにポインタアドレスをプリントする書式をご利用ください。