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を使う場合: スライス、マップ、チャネルのような内部状態を持つデータ構造を初期化したいとき。