[解決済み】なぜ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
との違いは
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つの組み込み関数にすることは可能です。しかし、2つの組み込み関数があるよりも、1つの組み込み関数の方が、新しいGoプログラマーの混乱を招く可能性が高いです。
以上の点を踏まえると、「Security」(セキュリティ)の観点からは
new
と
make
を分離したままにしておきます。
関連
-
[解決済み] GoのHTTP基本認証
-
[解決済み] 関数呼び出しで「値として使用」される
-
[解決済み] GolangパッケージがGOROOTにない(/usr/local/go/src/packageName) [閉じた]。
-
go build error, error can't load package: package xxx is not in GOROOT (D:\basic_tool╱GoGoSrc╱)
-
[解決済み] go getとgo installの違いは何ですか?
-
[解決済み] 環境変数GOPRIVATEの設定方法
-
[解決済み] Goでfloat64をintに変換する
-
[解決済み] パラメータと戻り値におけるポインタと値の比較
-
[解決済み】Goの構造体のスタックとヒープ割り当て、およびガベージコレクションとの関連性
-
[解決済み] なぜエイリアス関数をタイプして、キャストせずに使用できるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] インポート "google/api/annotations.proto" が見つからないか、エラーが発生しました。依存関係として追加するにはどうすればよいですか?
-
go build error, error can't load package: package xxx is not in GOROOT (D:\basic_tool╱GoGoSrc╱)
-
[解決済み] SETNXでシングルインスタンスのRedisをロックする
-
[解決済み] GOBINが設定されていない:go installを実行できない
-
[解決済み] 地図をコピーするには?
-
[解決済み] go言語でUUIDを生成する方法はありますか?
-
[解決済み] go get を使って特定のバージョンのパッケージをインポートするにはどうすればよいですか?
-
[解決済み] golangでnilはどういう意味ですか?
-
[解決済み】スライスの最後の要素を取得する方法は?
-
[解決済み】gopathを使わずにローカルパッケージをインポートする方法