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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-16 22:15:18878ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。