ホームページ > バックエンド開発 > Golang > Go メモリ割り当て: `new()` と `&{}` – 本当の違いは何ですか?

Go メモリ割り当て: `new()` と `&{}` – 本当の違いは何ですか?

Mary-Kate Olsen
リリース: 2024-12-16 22:15:18
オリジナル
876 人が閲覧しました

Go Memory Allocation: `new()` vs `&{}` – What's the Real Difference?

割り当ての難題: Go における new() と「通常の」ポインター

Go プログラミングの領域では、次のような疑問が生じます。新しいオブジェクトにメモリを割り当てるときに、次の 2 つのコード セグメントに大きな違いがありますか?

コードセグメント 1:

v := &Vector{}
ログイン後にコピー

コード セグメント 2:

v := new(Vector)
ログイン後にコピー

答え:

驚くべきことに、 2 つのコード セグメント間に目立った違いはありません。どちらも同じ結果、つまり Vector 型の新しいインスタンスへのポインタを作成します。

詳細な説明:

new(Vector) を呼び出すとき、新しいキーワード新しい Vector オブジェクトにメモリを割り当て、そのオブジェクトへのポインタを返します。同様に、&Vector{} も新しい Vector オブジェクトにメモリを割り当て、そのオブジェクトへのポインタを返します。

説明のために、次のコードを考えてみましょう。

package main

import "fmt"
import "reflect"

type Vector struct {
    x   int
    y   int
}

func main() {
    v := &Vector{}
    x := new(Vector)
    fmt.Println(reflect.TypeOf(v))
    fmt.Println(reflect.TypeOf(x))
}
ログイン後にコピー

出力:

*main.Vector
*main.Vector
ログイン後にコピー

ご覧のとおり、v と x はどちらも Vector オブジェクトへのポインターです。これらは同じ型です。

使用例:

どちらのコード セグメントでも同じ結果が得られますが、割り当てられたメモリが少なくなる場合には new の方が適切であると主張する開発者もいます。二重逆参照エラーを避けるのに役立つため、すぐに逆参照されて使用されます。例:

// Allocates memory and immediately dereferences it
v := new(Vector).x
ログイン後にコピー

結論:

結論として、Go で新しい割り当て構文を使用するか「通常の」割り当て構文を使用するかの選択は、純粋に個人的な好みになります。どちらのメソッドもメモリを割り当て、新しく作成されたオブジェクトへのポインタを返し、同じ機能を提供します。

以上がGo メモリ割り当て: `new()` と `&{}` – 本当の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート