2013-08-24 6 views
7

彼らは同じように見える:Goのnew(Struct)と&Struct {}の違いは何ですか?

package main 

import "fmt" 

type S struct { 
    i int 
} 

func main() { 
    var s1 *S = new(S) 
    fmt.Println(s1) 

    var s2 *S = &S{} 
    fmt.Println(s2) // Prints the same thing. 
} 

アップデート:

フム。私は、新しいものを使ってS.iを初期化する明白な方法がないことに気付いた。それを行う方法はありますか?​​が動作していないよう:/

答えて

7

documentationから:

制限する場合として、複合リテラルはまったくのフィールドが含まれていない場合、 それは型のゼロ値を作成します。式new(File)と &ファイル{}は同等です。

+0

新しいフィールドを使用してフィールドを初期化する方法はありますか? – allyourcode

+0

@allyourcodeはそうは思わない。 http://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct – Woot4Moo

+0

ドキュメントでは、なぜnew関数をインクルードすることにしたのですか?私は 'go'は重複していない機能に関するものだと考えました。 –

0

だけでなく、我々は、彼らが実際にあることがわかります...彼らは同じ結果の値を与えるが、我々は両方の方法何かを割り当て、それらの値を見れば...

// Adapted from http://tour.golang.org/#30 
package main 

import "fmt" 

type Vertex struct { 
    X, Y int 
} 

func main() { 
    v := &Vertex{} 
    v2 := new(Vertex) 
    fmt.Printf("%p %p", v, v2) 
} 

ん連続したメモリスロットに割り当てられます。典型的な出力:0x10328100 0x10328108。これが実装の詳細か仕様の一部かどうかはわかりませんが、どちらも同じプールから割り当てられていることを示しています。

Play around with the code here.

the language specによると、新に初期化するよう

:外出先での関数がオーバーロードすることはできませんのでThe built-in function new takes a type T and returns a value of type *T. The memory [pointed to] is initialized as described in the section on initial values.、これは可変引数関数ではありませんが、任意の初期化データを渡す方法はありません。代わりに、goはタイプと任意のメンバーフィールドに適切なバージョンの0のバージョンを使用して初期化します。

関連する問題