new関数について
スライスやマップを作成する際にmake関数を使った。これと同じようなものとしてnew関数がある。new関数はメモリを確保するための関数で、ポインタなどを作成する際に必要となる。
newを使ってポインタのアドレスを確保する
入門メモ⑧までは、まずint型の変数nを宣言し変数nのアドレスを「var p *int = &n」
というように変数pに代入して、ポインタを初期化していた。
new関数を使うと、値を何も代入しない状態で、メモリにポインタが入る領域を確保できる。次のように「var p *int = new(int)」と書いて、new関数でポインタの変更を作成して表示すると変数pのアドレスは表示される
var p *int = new(int)
fmt.Println(p)
//以下のように出力される
014000112018
次のように、new関数を使わずにポインタの変数を宣言して表示するとと表示される。
var p *int = new(int)
fmt.Println(p)
var p2 *int
fmt.Println(p2)
//以下のように出力される
014000112018
<nil>
new関数を使ってポインタを宣言すると、メモリの領域を確保する。
変数を表示するとアドレスが表示される。(このアドレスには値は入っていない)
一方で、new関数を使わない場合、まだメモリを確保していないので、ポインタの初期値であるという値が表示される。
new関数で作成した変数pの初期値を確認するとint型の初期値0が表示されることを確認できる。
var p *int = new(int)
fmt.Println(*p)
//以下のように出力される
0
ここで、*p++として変数pの実体に++で足し算をしてくと0,1と計算が行われていることが分かる。
var p *int = new(int)
fmt.Println(*p)
*p++
fmt.Println(*p)
//以下のように出力される
0
1
対して、new関数を使用しないで宣言したポインタに++を実行してもエラーになってしまう。これはnew関数を使わない場合はメモリの領域が確保されておらず、ポインタの中身にアクセスして足し算をしようとしてもエラーが発生してしまうことになる。
var p2 *int
fmt.Println(p2)
*p2++
fmt.Println(p2)
//以下のように出力される
<nil>
panic:runtime error:,,,(以下略)
new関数とmake関数の違い
new関数と似たものとしてmake関数(mapとスライスを作成する際に出てきたもの)がある。
スライスやマップはmake関数で、ポインタはnew関数で作成する。それぞれのデータ型を確認してみると、以下のようになる。
s := make([]int, 0)
fmt.Println("%T\n", s)
m := make(map[string]int)
fmt.Println("%T\n", m)
var p *int = new(int)
fmt.Println("%T\n", p)
//以下のように出力される
[]int
map[string]int
*int
new関数とmake関数の違いは、肩を確認したときにポインタを返す場合はnew関数でそれ以外の場合はmake関数を使うということになる。
学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP
・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897