Go言語のポインタについて基本てきなところを扱いました。
ここでは、それに関連してnew()という組み込み関数について見ていきます。
new()
new()は引数に型を取り、型のポインタを返す関数です。
受け取った型をゼロ値で初期化すると、ポインタを返すという性質があります。
具体的なコードで見てみましょう。
package main
import "fmt"
func main() {
var p1 *int
fmt.Println(p1)
fmt.Printf("%T\n", p1)
var p2 *int = new(int)
fmt.Println(p2)
fmt.Printf("%T\n", p2)
}
main関数の中でポインタ型を定義しています。
まずポインタ型のintの変数p1を定義しています。これはポインタの基本のところでやったことと同じです。ここでは何も代入していません。
Println()でp1を、Printf()でp1の型を出力しています。
次のここで扱うテーマのnew()を使います。
ポインタ型のintの変数p2を定義します。ここにnew()を当てはめ、引数にint型をとるように宣言しています。
これも同様にPrintln()でp2を、Printf()でp2の型を出力しています。
実行すると次のような出力になります。
<nil>
*int
0xc000012070
*int
このように、どちらもポインタ型のintを返していますが、p1の方の値は<nil>を返して何も割り当てられていないのがわかります。p2の方の値はメモリのアドレスが出力されているのがわかります。
こんどは、これを構造体で使ってみます。
package main
import "fmt"
func main() {
var s = new(struct{})
fmt.Println(s)
fmt.Printf("%T\n", s)
}
やり方は先ほどのコードと同じです。
ここではnew()の引数にstruct型のゼロ値で初期化するパターンです。
出力は次のようになります。
&{}
*struct {}
&が付与されたアドレスが表示され、ポインタ型のstructが表示されているのがわかります。
最後に
Go言語のポインタに関連してnew()という組み込み関数を扱いました。
new()関数は引数に型を取り、型のポインタを返す関数です。
受け取った型をゼロ値で初期化すると、ポインタを返すという性質があります。
このnew()との絡みで、structとポインタについてもう少しこちらで扱います。