2013-08-24 8 views
7

Sie scheinen gleich zu sein:Was ist der Unterschied zwischen Neu (Struct) und & Struct {} in Go?

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. 
} 

Update:

Hm. Ich habe gerade gemerkt, dass es keinen offensichtlichen Weg gibt, S. zu initialisieren. Gibt es eine Möglichkeit, das zu tun? new(S{i:1}) nicht zu funktionieren scheint:/

Antwort

7

Vom documentation:

als Grenzfall, wenn ein Verbund wörtlichen überhaupt keine Felder enthält, es schafft einen Nullwert für den Typ. Die Ausdrücke new (File) und & Datei {} sind äquivalent.

+0

Gibt es eine Möglichkeit, Felder mit neuen zu initialisieren? – allyourcode

+0

@allyourcode glaube nicht. http://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct – Woot4Moo

+0

Sagt die Dokumentation dann, warum sie gewählt haben, die 'neue' Funktion einzuschließen? Ich dachte, 'go 'war alles über nicht überlappende Funktionalität .. –

0

Nicht nur, dass sie den gleichen resultierenden Wert geben, aber wenn wir etwas in beiden Richtungen und schauen auf ihren Wert zuzuordnen ...

// 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) 
} 

... wir werden sehen, dass sie in der Tat in aufeinanderfolgenden Speicherplätzen zugewiesen. Typische Ausgabe: 0x10328100 0x10328108. Ich bin mir nicht sicher, ob dies ein Implementierungsdetail oder ein Teil der Spezifikation ist, aber es zeigt, dass sie beide aus demselben Pool zugewiesen werden.

Play around with the code here.

Was mit neuer Initialisierung nach 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. Da Funktionen in Go nicht überlastet werden, und dies ist keine variadische Funktion, gibt es keine Möglichkeit, in jeder Initialisierung Daten zu übergeben. Stattdessen wird go mit der Version 0 initialisieren, die für den Typ und alle Mitgliedsfelder sinnvoll ist.

Verwandte Themen