🛵

組み込み関数 make と new の違い

2022/03/08に公開約1,600字

Goには,組み込み関数[1]としてmakeというものとnewがあります
それぞれスライスや構造体など何かを『生成』するのに使用し,使い方は多岐に渡りますが,何より慣れないうちは

「あれ,この場合はmakeか?それともnewの方か?どっちだ...」

と混同される方も多いかと思います
今回はそれらの違いについて,ざっくりと解説いたします.

はじめに結論から

組み込み関数makeは、「スライス(slice)」,「マップ(map)」,「チャネル(channel)」 のデータ構造体を生成するために使用します!
そして組み込み関数new指定した型のポインタ型を生成するために使用します.

一つずつ解説

make

まず,上記でも述べたように,組み込み関数make「参照型」 と呼ばれる「スライス(slice)」,「マップ(map)」,「チャネル(channel)」の3つデータ構造を生成することができます
makeによる参照型生成のパターンは以下の通りです

呼び出し形式 意味
make(T, n) スライス 要素数と容量がTであるT型のスライスを生成
make(T, n, m) スライス 要素数がnで容量がmであるT型のスライスを生成
make(T) マップ T型のマップを生成
make(T, n) マップ T型のマップに要素数nを付与
make(T) チャネル バッファのないT型のチャネルを生成
make(T, n) チャネル バッファサイズnのT型のチャネルを生成
// 要素数と容量10のint型のスライスを生成
make([]int, 10)

// スライスに値を追加するための専用の組み込み関数 append を使い
// 値をスライスの末尾に追加などもできる
c = append(c, 100)

参照型である「スライス(slice)」,「マップ(map)」,「チャネル(channel)」についてはまた別の記事にて解説します.

new

newは,指定した型のポインタ型を生成するための組み込み関数です
しかし,主に,というかほとんどの場合で,構造体(struct)のポインタを生成するためにしか使われません

type Person struct {
  Name string
  Age  int
}

// *Person型の構造体(strcut)の生成
p := new(Person)

p.Name = Tom
p.Age  = 18

newは「指定した型のポインタ型を生成する」ためのものですので,次のような使い方もできるというわけです

// 変数iはint型のポインタ
i := new(int)

i = 13

しかし,やはりこのような記述はあまりリットがないですしあまり見かけません
つまり,主な用途としてはやはり「構造的型のポインタ生成」となりますね.

まとめ

  • スライス
  • マップ
  • チャネル

を使いたい,(作りたい)と言う場面ではmake

  • 構造体(strcut)

のポインタ型を生成したいという場面ではnewを使うと覚えておけばOKです.

脚注
  1. 元々そのプログラミング言語に固有で用意されている関数のこと ↩︎

GitHubで編集を提案

Discussion

ログインするとコメントできます