Odpowiedzi:
Oprócz fabriziom „s odpowiedzi , można zobaczyć więcej przykładów na« Go: Wykorzystanie Plastry i internals », gdzie zastosowanie dla []intwspomina:
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: nilplasterek 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ć maketutaj.
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 swskazuje na nil, while
s := make([]int, 0)
przydziela pamięć i swskazuje na pamięć wycinek z 0 elementami.
Zwykle pierwszy jest bardziej idiomatyczny, jeśli nie znasz dokładnego rozmiaru swojego przypadku użycia.
makemap, bo nawet puste mapmiejsce potrzebuje miejsca na jakąś księgowość.
nilw przypadku, gdy twój wycinek nie zawiera żadnego elementu, zamiast pustej tablicy. Jeśli jednak makezostanie 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>]
nilplasterek, a drugaemptyplasterek (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