2012-11-06 10 views

risposta

16

No. Nei ritornano è la stessa,

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

Risultato:

*main.Vector 
*main.Vector 

V'è una certa contesa nella mailing list che avere entrambi è confusa:

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs

Una cosa da notare:

new() è l'unico modo per ottenere un puntatore ad un intero senza nome o altro tipo di base. Puoi scrivere "p: = new (int)" ma non puoi scrivere "p: = & int {0}". Oltre a questo, è una questione di preferenza .

Fonte: https://groups.google.com/d/msg/golang-nuts/793ZF_yeqbk/-zyUAPT-e4IJ

+0

Suppongo che potrebbero supportare 'p: = & 0' se volevano mantenere il conto alla rovescia delle parole chiave. –

0

In questo esempio entrambi questi valori saranno assegnati sul mucchio. Go non è come C dove puoi determinare in modo esplicito dove viene allocata la memoria. Go esegue "analisi di escape" in fase di compilazione e alloca la memoria sullo heap se necessario. Da quello che ho capito, se mai ti riferisci all'indirizzo di un oggetto, questo verrà assegnato all'heap. Poiché v := &Vector{} sta assegnando l'indirizzo di Vector{} a v, il compilatore deciderà che è necessario assegnarlo all'heap.

3

Secondo Effective Go, new() è una funzione che alloca la memoria e la esclude; cioè ogni campo (e l'intero pezzo di memoria per la struttura) sarà impostato su 0 s. Se progetti le tue strutture in modo tale che quando vengono creati tutti i campi devono essere uguali a zero, allora è consigliabile utilizzarli. Se, tuttavia, è necessario un maggiore controllo su quali valori iniziali devono essere utilizzati, è necessario utilizzare il metodo più convenzionale.

Nel caso specifico si menziona la differenza è irrilevante, ma dovrebbe essere notato altrove.

Spero che questo aiuti! :)

10

Sì, c'è una differenza fondamentale tra i due frammenti di codice.

v := &Vector{} 

Lavori solo per Vector essere un tipo struct, carta tipo, tipo array o un tipo di sezione

v := new(Vector) 

Works per Vector di qualsiasi tipo.

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

+0

Dire "nuovo (Mappa)" non è una buona idea: http://play.golang.org/p/u89EYchY5n - mappe, sezioni e canali devono essere fatti con 'make()', e dato che sono di riferimento i tipi comunque renderli con 'new()' non ha senso. –

+0

Questo non è un problema di 'nuovo'. In realtà non c'è niente di sbagliato in 'new (anyType)': http://play.golang.org/p/e3hmtK_IV8 – zzzz

+0

Sei corretto, ma è ancora inutile dato che 'map' è già un puntatore quindi' make() ' è la cosa giusta da usare, non 'new()'. –

Problemi correlati