1. ホーム
  2. 行く

[解決済み】なぜmake()やnew()をするのでしょうか?)

2022-04-03 09:48:21

質問

イントロダクションのドキュメントでは、多くの段落を割いて、以下のような違いが説明されています。 new()make() が、実際にはローカルスコープ内でオブジェクトを生成し、それを返すことができます。

なぜアロケータのペアを使うのですか?

どのように解決するのか?

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

との違いは newmake は、次の例を見ていただければわかると思います。

p := new(chan int)   // p has type: *chan int
c := make(chan int)  // c has type: chan int

仮にGoが newmake が、ビルトイン機能として 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

はい、マージします。 newmake を1つの組み込み関数にすることは可能です。しかし、2つの組み込み関数があるよりも、1つの組み込み関数の方が、新しいGoプログラマーの混乱を招く可能性が高いです。

以上の点を踏まえると、「Security」(セキュリティ)の観点からは newmake を分離したままにしておきます。