2013-08-24 16 views
7

sembrano essere la stessa:Qual è la differenza tra nuovo (Struct) e & 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. 
} 

Aggiornamento:

Hm. Ho appena realizzato che non esiste un modo ovvio per inizializzare S.i usando new. C'è un modo per farlo? new(S{i:1}) non sembra funzionare:/

risposta

7

Dal documentation:

Come caso limite, se un letterale composito contiene campi affatto, crea un valore zero per il tipo. Le espressioni nuove (File) e & File {} sono equivalenti.

+0

C'è un modo per inizializzare i campi usando nuovo? – allyourcode

+0

@allyourcode non la penso così. http://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct – Woot4Moo

+0

La documentazione dice allora, perché hanno scelto di includere la funzione 'new'? Ho pensato che "go" riguardasse la non sovrapposizione di funzionalità. –

0

Non solo essi danno lo stesso valore risultante, ma se noi destiniamo qualcosa in entrambe le direzioni e guardare i loro valori ...

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

... vedremo che essi sono in realtà allocato in slot di memoria consecutivi. Uscita tipica: 0x10328100 0x10328108. Non sono sicuro se si tratta di un dettaglio di implementazione o di una parte della specifica, ma dimostra che vengono entrambi allocati dallo stesso pool.

Play around with the code here.

Come per inizializzare con il nuovo, secondo 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. Perché funzioni in movimento non possono essere sovraccaricati, e questo non è una funzione variadic, non c'è modo per passare i dati di inizializzazione. Invece, go lo inizializzerà con qualsiasi versione di 0 ha senso per il tipo e qualsiasi campo membro, a seconda dei casi.

Problemi correlati