Mówisz „nieokreślony rozmiar”, ale plastry nigdy nie mają ustalonego rozmiaru. Chyba że masz na myśli zerową pojemność. Uwaga: jeśli masz pomysł / zgadnij / podpowiedź, jakiej pojemności możesz potrzebować, to użycie wersji z trzema argumentami jest dobre. Np. Żeby zbudować kawałek kluczy do mapy:keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
wycinek zerowy jest funkcjonalnie równoważny wycinku zerowej długości, nawet jeśli nie wskazuje na nic. Ma długość zero i może być dołączony wraz z alokacją.
nilPlaster będzie jednak json.Marshal()pod "null"natomiast pusty plaster będzie zebrać się "[]", jak podkreślił @farwayer.
Żadna z powyższych opcji nie spowoduje przydziału, jak wskazał @ArmanOrdookhani.
Ponadto należy zachować ostrożność: reflect.DeepEqualrozróżnia zerowe plastry i plastry nie zerowe: a := []int{}, var b []int,reflect.DeepEqual(a, b) // returns false
asgaines
1
Dlaczego uważasz, że to przydział? Limit wynosi zero, więc nic nie jest przydzielane. Wszystkie wskaźniki zerowej długości wskazują na to samo miejsce w pamięci: play.golang.org/p/MPOKKl_sYvw
Arman Ordookhani
1
@ArmanOrdookhani Masz rację. Wypróbowałem to i dowiedziałem się, że mylę się z moim założeniem dotyczącym identycznych instrukcji montażu. Naprawiony!
Oba wycinki mają 0pojemność, co oznacza, że oba wycinki mają 0długość (nie może być większa niż pojemność), co oznacza, że oba wycinki nie mają elementów. Oznacza to, że 2 plastry są identyczne pod każdym względem.
make([]int, 0)jest najlepszy, ponieważ Jetbrains GoLand nie narzeka, że jest „niepotrzebny”, jak to ma miejsce w przypadku []int{}. Jest to przydatne podczas pisania testów jednostkowych.
keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
Odpowiedzi:
Dwie podane alternatywy są semantycznie identyczne, ale użycie
make([]int, 0)
spowoduje wewnętrzne wywołanie runtime.makeslice (Go 1.14).Możesz też pozostawić
nil
wartość:Jak napisano na blogu Golang.org :
nil
Plaster będzie jednakjson.Marshal()
pod"null"
natomiast pusty plaster będzie zebrać się"[]"
, jak podkreślił @farwayer.Żadna z powyższych opcji nie spowoduje przydziału, jak wskazał @ArmanOrdookhani.
źródło
json.Marshal()
wrócinull
po zainicjowany plasterekvar myslice []int
i[]
na niegomyslice := []int{}
reflect.DeepEqual
rozróżnia zerowe plastry i plastry nie zerowe:a := []int{}
,var b []int
,reflect.DeepEqual(a, b) // returns false
Są równoważne. Zobacz ten kod:
Wynik:
Oba wycinki mają
0
pojemność, co oznacza, że oba wycinki mają0
długość (nie może być większa niż pojemność), co oznacza, że oba wycinki nie mają elementów. Oznacza to, że 2 plastry są identyczne pod każdym względem.Zobacz podobne pytania:
Po co mieć zero i pusty kawałek w Golang?
zero plasterków vs non-zero plasterków vs puste plasterki w języku Go
źródło
Jako dodatek do odpowiedzi @ANisus ...
poniżej znajduje się kilka informacji z książki „Go in action” , o której moim zdaniem warto wspomnieć:
Różnica między
nil
&empty
plasterkamiJeśli pomyślimy o takim kawałku:
następnie:
Przykład placu zabaw :
drukuje:
źródło
make
?make
wydaje się , że nie zwraca adresu. Wierzę, że nie możesz tego zrobić jednym krokiem.Pusty wycinek i zerowy wycinek są różnie inicjowane w Go:
Tak jak w przypadku wszystkich trzech plasterków, długość i czapka wynoszą 0.
źródło
make([]int, 0)
jest najlepszy, ponieważ Jetbrains GoLand nie narzeka, że jest „niepotrzebny”, jak to ma miejsce w przypadku[]int{}
. Jest to przydatne podczas pisania testów jednostkowych.