Go言語では、データを初期化するためにmake
とnew
という2つの異なる関数が用意されています。これらは似たような役割を持つように見えますが、実際には異なる目的と使用方法があります。
1. new
関数
-
基本的な役割:
new
は任意の型のゼロ値を持つポインタを生成します。 -
使い方: 例えば、
new(int)
とすると、整数型のゼロ値(0)を持つポインタが作成されます。 -
具体例:
var num *int = new(int) // int型のポインタを作成 fmt.Println(*num) // 0が出力される *num = 42 // ポインタを通じて値を変更 fmt.Println(*num) // 42が出力される
2. make
関数
-
基本的な役割:
make
はスライス、マップ、チャネルを初期化するために使用されます。これらのデータ構造には内部状態があり、make
を使うことでそれらを正しくセットアップできます。 -
使い方: 例えば、
make([]int, 5)
とすると、5つの要素を持つ整数型スライスが作成されます。 -
具体例:
slice := make([]int, 5) // 5つの要素を持つスライスを作成 fmt.Println(slice) // [0 0 0 0 0]が出力される slice[0] = 10 // スライスの要素を変更 fmt.Println(slice) // [10 0 0 0 0]が出力される
3. make
とnew
の違いまとめ
特徴 | new |
make |
---|---|---|
目的 | 任意の型のゼロ値ポインタを生成する | スライス、マップ、チャネルを初期化する |
返り値 | ポインタ(ゼロ値を持つ) | 初期化されたデータ構造 |
使用例 | new(int) |
make([]int, 5) |
まとめ
-
new
を使う場合: 自分が作成した構造体や基本的なデータ型のポインタを扱いたいとき。 -
make
を使う場合: スライス、マップ、チャネルのような内部状態を持つデータ構造を初期化したいとき。