58

Go では、次の 2 つのコード セグメントに顕著な違いはありますか。

v := &Vector{}

とは対照的に

v := new(Vector)
4

4 に答える 4

47

いいえ。返されるものは同じです。

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

于 2012-11-06T05:58:44.730 に答える
22

はい、2 つのコード フラグメントには根本的な違いがあります。

v := &Vector{}

構造体型、マップ型、配列型、またはスライス型である場合にのみ機能しますVector

v := new(Vector)

どんなタイプVectorも対応。

例: http://play.golang.org/p/nAHjL1ZEuu

于 2012-11-06T07:08:53.777 に答える
-1

Effective Goによるとnew()、メモリを割り当ててゼロにする関数です。つまり、すべてのフィールド (および構造体のメモリ全体) が0s に設定されます。作成時にすべてのフィールドゼロになるように構造を設計する場合は、それを使用することをお勧めします。ただし、使用する初期値をさらに制御する必要がある場合は、より一般的な方法を使用する必要があります。

特定のケースでは、違いは無関係であると述べていますが、他の場所で注意する必要があります。

これが役立つことを願っています!:)

于 2012-11-06T06:01:57.383 に答える