2014-08-28 19 views
44

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?

+0

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

risposta

46

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 nilp int[] è sufficiente come una sezione da aggiungere.

+0

Grazie! Questo è quello di cui ho bisogno. –

55

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.

+0

Posso dire lo stesso per la mappa? var m map [stringa] int vs m: = make (map [stringa] int)? Grazie. – joshua

+7

Nah, devi 'fare' le mappe, perché anche una' mappa' vuota ha bisogno di spazio allocato per un po 'di contabilità. – twotwotwo

+5

Se è necessario restituire una sezione con 0 elementi (anziché 'nil'), make è l'uso corretto. – Jess

Problemi correlati