Il modo migliore per chiedere è probabilmente alle persone che ci lavorano; esattamente quello che ho fatto !
Tl; dr: era originariamente lì prima make
e &{}
, ed è ancora la funzione da utilizzare in alcune situazioni.
Fondamentalmente, ecco le parti più importanti citate:
Quindi qual è il ragionamento alla base del nuovo? È qualcosa di utile? Dovremmo usarlo?
Non puoi farlo senza nuovo
v := new(int)
*v++
fmt.Println(*v)
nuovo non è una funzionalità principale di Go, non lo troverai usato spesso, ma quando ne hai bisogno, è lì.
Saluti
Dave
Dopo un'altra risposta che mostra questo tipo di soluzione:
vv := 0
v := &vv
*v++
fmt.Println(*v)
Ho chiesto ulteriori chiarimenti:
Quindi, fondamentalmente, il punto di Dave non regge davvero?
Ci sono luoghi in cui è scomodo intrufolarsi in una nuova variabile solo per prendere il suo indirizzo.
new (T) ha un significato immediatamente diretto, piuttosto che essere un linguaggio a più fasi.
Il punto di Dave cade solo se la semplice possibilità tecnica (di fare a meno
new
) è avvincente da sola.
Non è stato discusso perché era ovvio che Go avrebbe dovuto farlo perché quasi tutte le lingue ce l'hanno?
Il "dobbiamo mantenere new
?" la discussione si apre di volta in volta. Dal momento che non possiamo eliminarlo fino a Go 2, se capisco correttamente la Promessa, sembra che non ci sia molto da fare andando di nuovo in giro; quando Go 2 è pensabile, potremmo avere idee diverse e migliori ...
Chris
È anche lì principalmente per motivi storici:
devi considerare la storia del progetto. penso che il nuovo sia introdotto prima che ci sia make.
Questo è vero. In effetti abbiamo lottato per un po 'prima di elaborare l'idea di make. Se guardi i log del repository puoi vedere che make compare solo a gennaio 2009, revisione 9a924177598f.
La nuova funzione incorporata ha anche preceduto l'idea di & {} per prendere l'indirizzo di un letterale composito (e quella sintassi è in qualche modo sbagliata; probabilmente dovrebbe essere (* T) {campi di T} ma non c'era abbastanza motivo per cambiarlo).
La nuova funzione non è strettamente necessaria ma il codice sembra usarla nella pratica. È difficile liberarsene a questo punto.
Ian