Odpowiedzi:
Oprócz fabriziom „s odpowiedzi , można zobaczyć więcej przykładów na« Go: Wykorzystanie Plastry i internals », gdzie zastosowanie dla []int
wspomina:
Ponieważ zerowa wartość wycinka (
nil
) działa jak wycinek o zerowej długości , możesz zadeklarować zmienną wycinka, a następnie dołączyć do niej w pętli:
// 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
}
Oznacza to, że aby dołączyć do wycinka, nie musisz najpierw przydzielać pamięci: nil
plasterek p int[]
wystarczy jako plasterek do dodania.
var p []int
łatwiejsza niż używanie make
(co kojarzy mi się bardziej z alokacją, mimo że z pułapem 0, to niczego by nie alokowało). Jeśli chodzi o czytelność, wolę nie używać make
tutaj.
p := []int{}
.). Ponieważ zwykle używamy :=
składni do deklarowania większości zmiennych, bardziej naturalne jest mieć ją wszędzie, zamiast mieć wyjątki dla wycinków. Poza tym myślenie o alokacjach zwykle skłania ludzi do przedwczesnej optymalizacji.
Prosta deklaracja
var s []int
nie przydziela pamięci i s
wskazuje na nil
, while
s := make([]int, 0)
przydziela pamięć i s
wskazuje na pamięć wycinek z 0 elementami.
Zwykle pierwszy jest bardziej idiomatyczny, jeśli nie znasz dokładnego rozmiaru swojego przypadku użycia.
make
map, bo nawet puste map
miejsce potrzebuje miejsca na jakąś księgowość.
nil
w przypadku, gdy twój wycinek nie zawiera żadnego elementu, zamiast pustej tablicy. Jeśli jednak make
zostanie użyty do utworzenia wycinka, zamiast tego zostanie zwrócona pusta tablica, co jest ogólnie pożądanym efektem.
var s []int
) wyprodukuje null
, podczas gdy marshaling the empty slice ( s := make([]int, 0)
) da oczekiwany[]
Właśnie znalazłem różnicę. Jeśli użyjesz
var list []MyObjects
a następnie kodujesz dane wyjściowe jako JSON, otrzymujesz null
.
list := make([]MyObjects, 0)
wyniki []
zgodnie z oczekiwaniami.
Nieco pełniej (jeszcze jeden argument make
) przykład:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Na zewnątrz:
length: 2 - capacity 5 - content: [0 0]
Lub z dynamicznym typem slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Na zewnątrz:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
plasterek, a drugaempty
plasterek (taka jest terminologia używana w książce „Idź w akcji” ). Aby uniknąć publikowania tej samej odpowiedzi również tutaj, możesz sprawdzić stackoverflow.com/a/45997533/1561148