In Vai, esiste una notevole differenza tra i due segmenti di codice:C'è una differenza tra l'allocazione new() e "regular"?
v := &Vector{}
al contrario di
v := new(Vector)
In Vai, esiste una notevole differenza tra i due segmenti di codice:C'è una differenza tra l'allocazione new() e "regular"?
v := &Vector{}
al contrario di
v := new(Vector)
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
Suppongo che potrebbero supportare 'p: = & 0' se volevano mantenere il conto alla rovescia delle parole chiave. –
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.
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! :)
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
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. –
Questo non è un problema di 'nuovo'. In realtà non c'è niente di sbagliato in 'new (anyType)': http://play.golang.org/p/e3hmtK_IV8 – zzzz
Sei corretto, ma è ancora inutile dato che 'map' è già un puntatore quindi' make() ' è la cosa giusta da usare, non 'new()'. –
possibile duplicato di [GO:? Il motivo per cui vorrei fare() o new()] (http://stackoverflow.com/questions/9320862/go-why-would-i-make -o-nuovo) –