導入ドキュメントでは、new()
との違いを説明するために多くの段落が割かれていますmake()
が、実際には、ローカル スコープ内でオブジェクトを作成して返すことができます。
なぜアロケータのペアを使用するのでしょうか?
ベストアンサー1
Go には、メモリの割り当てと値の初期化の方法が複数あります。
&T{...}
、、、&someLocalVar
new
make
複合リテラルを作成するときにも割り当てが発生することがあります。
new
整数などの値を割り当てるために使用できるが、&int
これは違法である:
new(Point)
&Point{} // OK
&Point{2, 3} // Combines allocation and initialization
new(int)
&int // Illegal
// Works, but it is less convenient to write than new(int)
var i int
&i
と の違いはnew
、make
次の例を見るとわかります。
p := new(chan int) // p has type: *chan int
c := make(chan int) // c has type: chan int
Go に と はないnew
がmake
、組み込み関数 があるとしますNEW
。その場合、サンプル コードは次のようになります。
p := NEW(*chan int) // * is mandatory
c := NEW(chan int)
は*
必須なので、次のようになります。
new(int) --> NEW(*int)
new(Point) --> NEW(*Point)
new(chan int) --> NEW(*chan int)
make([]int, 10) --> NEW([]int, 10)
make(Point) // Illegal
make(int) // Illegal
はい、new
とmake
を 1 つの組み込み関数にマージすることは可能です。ただし、組み込み関数が 1 つだと、組み込み関数が 2 つある場合よりも、新しい Go プログラマーの間で混乱が生じる可能性があります。
上記のすべての点を考慮すると、new
とmake
を分離したままにしておく方が適切であると思われます。