Go ではメモリ管理が最も重要であり、new() 関数を通じてメモリを割り当てます。または、アンパサンド (&) が効率と精度に関する議論を煽りました。この記事では、これら 2 つの割り当て方法の微妙な違いを掘り下げ、それらの類似点と潜在的な相違点を調べます。
コード スニペットの概要あなたが提供したものはそう思われるかもしれません区別不能:
v := &Vector{}
対
v := new(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
示されているように、両方のメソッドは Vector 構造体のインスタンスへのポインターを返します。
new() と通常の割り当ての両方の存在が、Go コミュニティ内で混乱を引き起こしました。両方の選択肢を持つ必要はなく、誤解を招く可能性があると主張する人もいます。この議論は Go メーリング リストで広まりました:
[https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs](https://groups.google .com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs)
new() と通常の割り当てでは同様の結果が得られるというのが一般的な見解ですが、注目すべき例外が 1 つあります。名前のない整数型またはその他の基本型を操作する場合、ポインターを取得するための唯一のオプションは new() になります。次のコードはこれを示しています。
p := new(int) // Error: cannot take the address of the type int p := &int{0}
このシナリオでは、名前のない整数型へのポインターを作成できるメソッドは new() だけです。
戻り値の点では、new() と通常の割り当ての間に大きな違いはありませんが、それらの存在により混乱が生じる可能性があります。ただし、名前のない整数または基本型へのポインターを扱う場合には new() が不可欠であることを覚えておくと、その使用法を明確にし、潜在的な落とし穴を回避するのに役立ちます。 Go のメモリ管理手法の微妙な点を理解することで、開発者は効率と明瞭さのためにコードを最適化できます。
以上がGo メモリ割り当て: `new()` と `&` をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。