Risposte:
Oltre a fabriziom 's risposta , è possibile vedere altri esempi in ' Go fette: utilizzo e interni ', in cui un uso per []int
è menzionato:
Poiché il valore zero di una slice (
nil
) agisce come una slice di lunghezza zero , puoi dichiarare una variabile slice e poi aggiungerla 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
}
Significa che, per aggiungere una slice, non devi prima allocare memoria: la nil
slice p int[]
è sufficiente come slice a cui aggiungere.
var p []int
più facile che usare make
(che associo di più all'allocazione, anche se con un limite di 0, non allocherebbe nulla). In termini di leggibilità, preferisco non utilizzare make
qui.
p := []int{}
). Dato che di solito usiamo la :=
sintassi per dichiarare la maggior parte delle variabili, è più naturale averla ovunque invece di avere eccezioni per le sezioni. Oltre a questo, cercare di pensare alle allocazioni di solito spinge le persone verso ottimizzazioni premature.
Semplice dichiarazione
var s []int
non alloca memoria e s
punta a nil
, while
s := make([]int, 0)
alloca memoria e s
punta alla memoria a uno slice con 0 elementi.
Di solito, il primo è più idiomatico se non conosci la dimensione esatta del tuo caso d'uso.
make
mappe, perché anche un vuoto ha map
bisogno di spazio assegnato per qualche contabilità.
nil
nel caso in cui la tua slice non abbia alcun elemento, piuttosto che un array vuoto. Tuttavia, se make
viene utilizzato per creare la sezione, verrà restituito un array vuoto, che in genere è l'effetto desiderato.
var s []int
) produrrà null
, mentre il marshalling della slice vuota ( s := make([]int, 0)
) produrrà l'atteso[]
Ho appena trovato una differenza. Se usi
var list []MyObjects
e poi codifichi l'output come JSON, ottieni null
.
list := make([]MyObjects, 0)
risultati []
come previsto.
Un po 'più completamente (un altro argomento in make
) esempio:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Su:
length: 2 - capacity 5 - content: [0 0]
O con tipo dinamico di slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Su:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
slice, mentre il secondo crea unoempty
slice (questa è la terminologia usata dal "Go in action book" ). Per evitare di postare la stessa risposta anche qui, è possibile controllare stackoverflow.com/a/45997533/1561148