Perché c'è un "nuovo" in Go?

42

Sono ancora perplesso sul motivo per cui abbiamo new in Vai.

Quando vuoi istanziare una struttura, fai

t := Thing{}

e puoi ottenere un puntatore a una nuova istanza facendo

t := &Thing{}

Ma c'è anche questa possibilità:

t := new(Thing)

Quest'ultima sembra un po 'aliena per me. &Thing{} è chiaro e conciso come new(Thing) e utilizza solo i costrutti che usi spesso altrove. È anche più estensibile in quanto potresti cambiarlo in &Thing{3} o &Thing{Feets:7} .

Secondo me, avere una parola chiave supplementare 1 è costoso, rende la lingua più complessa e aggiunge a ciò che devi sapere. E potrebbe mascherare ai nuovi arrivati cosa c'è dietro l'istanziazione di una struttura.

Crea anche un'altra parola riservata.

Quindi qual è il ragionamento alla base di new ? A volte è utile? Dovremmo usarlo?

1 : Sì, lo so che non è una parola chiave a livello di grammatica, puoi shadow it , ma ciò non cambia il fatto che è, per lo sviluppatore ragionevole, una parola riservata.

    
posta Denys Séguret 04.09.2013 - 09:31
fonte

3 risposte

36

Il modo migliore per chiedere è probabilmente alle persone che ci lavorano; esattamente ciò che ho fatto !

Tl; dr: era originariamente presente prima di make e &{} , ed è ancora la funzione da utilizzare in alcune situazioni.

Fondamentalmente, ecco le parti più importanti citate:

So what's the reasoning behind new ? Is it something useful ? Should we use it ?

     

Non puoi farlo senza nuovo

v := new(int)
*v++
fmt.Println(*v)

new isn't a headline feature of Go, you won't find it used often, but when you need it, it is there.

Cheers

Dave

Dopo un'altra risposta che mostra questo tipo di soluzione:

vv := 0
v := &vv
*v++
fmt.Println(*v)

Ho chiesto ulteriori chiarimenti:

So basically, Dave's point doesn't really stand?

     

Ci sono luoghi in cui è scomodo inserirsi di nascosto in un nuovo   variabile solo per prendere il suo indirizzo.

     

new (T) ha un significato immediatamente immediato, piuttosto che   essere un idioma multi-passo.

     

Il punto di Dave cade solo se la mera possibilità tecnica (di fare senza    new ) è convincente da solo.

     

Wasn't this discussed because it was just obvious that Go should have it because almost every language has it?

     

Il "dovremmo mantenere new ?" la discussione si apre di tanto in tanto.   Dal momento che non possiamo portarlo fuori fino a Go 2, se comprendo correttamente la Promessa,   non sembra esserci molto da girare intorno al   loop di nuovo; nel momento in cui Go 2 è pensabile, potremmo averne alcuni   idee diverse e migliori ...

     

Chris

Ci sono anche per lo più per ragioni storiche:

you need to consider the history of the project. i think new is introduced first before there is make.

     

Questo è vero. In effetti abbiamo faticato per un po 'prima di venire fuori   l'idea di fare. Se guardi i registri del repository puoi vederlo   make compare solo nel gennaio 2009, revisione 9a924177598f.

     

Anche la nuova funzione incorporata ha preceduto l'idea di & {} per prendere il   indirizzo di un letterale composito (e quella sintassi è in un certo senso   sbagliato; probabilmente dovrebbe essere (* T) {campi di T} ma non c'era   motivo sufficiente per cambiarlo).

     

La nuova funzione non è strettamente necessaria ma il codice sembra funzionare   in pratica. È difficile liberarsene a questo punto.

     

Ian

    
risposta data 05.11.2013 - 15:02
fonte
-1

Di 'se devi definire un tipo basato sul tipo primitivo esistente int.

type MyInt int

Ora vuoi creare un'istanza da quella. cioè) Puntatore a quella variabile:

L'unico modo per farlo è:

x := new(MyInt)
*x = 7
    
risposta data 28.09.2016 - 17:31
fonte
-2

Probabilmente è principalmente lì per la leggibilità.

La leggibilità spesso si traduce in scrittura, e di solito rende più veloce una lingua da raccogliere. Per i programmatori Python, è fantastico che Python permetta di fare affermazioni come questa:

if flag is not None:

È solo una parola grammatica fuori dall'inglese perfetto; mentre, non avendo mai programmato in Go prima, non avrei idea di cosa significasse &Thing{} .

Detto questo, non esiste un "modo giusto" per programmare una lingua, e naturalmente una stanza piena di programmatori Go ben informati potrebbe probabilmente realizzare il loro progetto in meno tempo rispetto ai programmatori Python che usano trucchi insider; So che questo è spesso il caso per me con il codice Javascript (un linguaggio con cui ho familiarità, ma devo accettare spesso rende poco o nessun senso).

    
risposta data 04.09.2013 - 15:51
fonte

Leggi altre domande sui tag