In Golang, qual è la differenza tra var s []int
e s := make([]int, 0)
?Dichiarare una fetta o fare una fetta?
Trovo che entrambi funzionino, ma quale è meglio?
In Golang, qual è la differenza tra var s []int
e s := make([]int, 0)
?Dichiarare una fetta o fare una fetta?
Trovo che entrambi funzionino, ma quale è meglio?
Oltre a fabriziom s' answer, è possibile vedere più esempi a "Go Slices: usage and internals", dove viene menzionato un impiego per []int
:
Dal momento che il valore zero di una fetta (
nil
) si comporta come un di lunghezza zero fetta, è possibile dichiarare una variabile fetta e quindi aggiungere ad essa in un ciclo:
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
mi ans che, per aggiungere una porzione, non è necessario allocare prima la memoria: la fetta nil
p int[]
è sufficiente come una sezione da aggiungere.
Grazie! Questo è quello di cui ho bisogno. –
dichiarazione semplice
var s []int
non alloca memoria e s
punti nil
, mentre
s := make([]int, 0)
alloca memoria e s
punti di memoria ad una fetta con 0 elementi.
Di solito, il primo è più idiomatico se non si conosce la dimensione esatta del proprio caso d'uso.
Posso dire lo stesso per la mappa? var m map [stringa] int vs m: = make (map [stringa] int)? Grazie. – joshua
Nah, devi 'fare' le mappe, perché anche una' mappa' vuota ha bisogno di spazio allocato per un po 'di contabilità. – twotwotwo
Se è necessario restituire una sezione con 0 elementi (anziché 'nil'), make è l'uso corretto. – Jess
Il primo crea una slice 'nil', mentre il secondo crea una slice' empty' (questa è la terminologia utilizzata da * "Go in action book" *). Per evitare di pubblicare la stessa risposta anche qui, puoi controllare https://stackoverflow.com/a/45997533/1561148 – tgogos