Go では、次の 2 つのコード セグメントに顕著な違いはありますか。
v := &Vector{}
とは対照的に
v := new(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
メーリングリストには、両方を持っていると混乱するという論争があります:
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs
注意すべき点:
new() は、名前のない整数またはその他の基本型へのポインターを取得する唯一の方法です。「p := new(int)」は書けますが、「p := &int{0}」は書けません。それ以外は好みの問題です。
ソース: https://groups.google.com/d/msg/golang-nuts/793ZF_yeqbk/-zyUAPT-e4IJ
はい、2 つのコード フラグメントには根本的な違いがあります。
v := &Vector{}
構造体型、マップ型、配列型、またはスライス型である場合にのみ機能しますVector
v := new(Vector)
どんなタイプVector
にも対応。
Effective Goによるとnew()
、メモリを割り当ててゼロにする関数です。つまり、すべてのフィールド (および構造体のメモリ全体) が0
s に設定されます。作成時にすべてのフィールドがゼロになるように構造を設計する場合は、それを使用することをお勧めします。ただし、使用する初期値をさらに制御する必要がある場合は、より一般的な方法を使用する必要があります。
特定のケースでは、違いは無関係であると述べていますが、他の場所で注意する必要があります。
これが役立つことを願っています!:)