Jaka jest różnica między var s []int
i s := make([]int, 0)
?
Uważam, że oba działają, ale który z nich jest lepszy?
go
allocation
slice
Wang Yi
źródło
źródło
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/1561148Odpowiedzi:
Oprócz fabriziom „s odpowiedzi , można zobaczyć więcej przykładów na« Go: Wykorzystanie Plastry i internals », gdzie zastosowanie dla
[]int
wspomina:Oznacza to, że aby dołączyć do wycinka, nie musisz najpierw przydzielać pamięci:
nil
plasterekp int[]
wystarczy jako plasterek do dodania.źródło
var p []int
łatwiejsza niż używaniemake
(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
nie przydziela pamięci i
s
wskazuje nanil
, whileprzydziela 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.
źródło
make
map, bo nawet pustemap
miejsce potrzebuje miejsca na jakąś księgowość.nil
w przypadku, gdy twój wycinek nie zawiera żadnego elementu, zamiast pustej tablicy. Jeśli jednakmake
zostanie użyty do utworzenia wycinka, zamiast tego zostanie zwrócona pusta tablica, co jest ogólnie pożądanym efektem.var s []int
) wyprodukujenull
, podczas gdy marshaling the empty slice (s := make([]int, 0)
) da oczekiwany[]
Właśnie znalazłem różnicę. Jeśli użyjesz
a następnie kodujesz dane wyjściowe jako JSON, otrzymujesz
null
.wyniki
[]
zgodnie z oczekiwaniami.źródło
Nieco pełniej (jeszcze jeden argument
make
) przykład:Na zewnątrz:
Lub z dynamicznym typem
slice
:Na zewnątrz:
źródło