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 nilslice p int[]è sufficiente come slice a cui aggiungere.
var p []intpiù 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 makequi.
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 spunta a nil, while
s := make([]int, 0)
alloca memoria e spunta 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.
makemappe, perché anche un vuoto ha mapbisogno di spazio assegnato per qualche contabilità.
nilnel caso in cui la tua slice non abbia alcun elemento, piuttosto che un array vuoto. Tuttavia, se makeviene 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>]
nilslice, mentre il secondo crea unoemptyslice (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