Go での "new()" と "通常" の割り当ての区別
Go では、メモリを割り当てる方法が 2 つあります。 「new()」関数、またはアンパサンド演算子「&」を介した「通常の」割り当ての実行。 2 つのアプローチは似ているように見えますが、異なる結果が生成されます。
「new()」について
「new()」関数は、初期化されていない新しい値を割り当てます。指定された型を取得し、その値へのポインタを返します。 「new()」が呼び出されると、「malloc」を使用してヒープ上にメモリが割り当てられます。 「通常の」割り当てとは異なり、「new()」は、指定されたタイプのメモリをゼロ値に初期化します。
「&」による通常の割り当てについて
" Regular " 割り当てでは、"&" 演算子を使用して既存の値へのポインターを取得します。このメソッドはスタック上にメモリを割り当て、返されたポインタを割り当てられたメモリのアドレスに設定します。 「通常の」割り当てではメモリが初期化されず、初期化されていない値が残ります。
実際の違い
「new()」と「通常」の主な違い割り当ては、割り当てられたメモリの初期化にあります。 「new()」はメモリをゼロ値に初期化し、データが常に予測可能であることを保証します。対照的に、「通常の」割り当てではメモリが初期化されないままになるため、使用前に明示的な初期化が必要になります。
使用上の考慮事項
「new()」と「通常」の選択割り当ては特定の使用例によって異なります。予測可能な初期状態を必要とする構造体または複雑なデータ構造を扱う場合は、「new()」が推奨されます。 「通常の」割り当ては、直接初期化できる整数や浮動小数点数などの単純なデータ型の場合により効率的です。
例
次の例は、「新規」と「新規」の違いを示しています。 ()」と通常の割り当て:
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
示されているように、「new()」と「&」はどちらも Vector オブジェクトへのポインターを返します。ただし、「new()」は Vector の値をゼロに初期化していますが、「&」割り当ては初期化していません。
以上がGo メモリ割り当て: `new()` と `&` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。