A Go plaster zawiera trzy elementy: dane, długość i pojemność.
s := make([]int, 0, 10)
Zmienna s jest kawałek wskazówki o długości 0 i pojemności 10. Wbudowany len() i nasadki() funkcje pozwalają uzyskać długość i pojemność kawałek:
len(s) == 0
cap(s) == 10
Aby zwiększyć długość kawałek, po prostu re-slice:
s = s[0:5]
// len(s) == 5
// cap(s) == 10
Aby zmniejszyć długość, można wziąć pod-plaster:
s = s[0:1]
// len(s) == 1
Istnieje kilka krótszych sposoby na wywołanie make():
a := make([]int, 10)
// len(a) == cap(a) == 10
b := make([]int)
// len(b) == cap(b) == 0
To wszystko dobrze, ale co jeśli trzeba zwiększyć długość wycinka poza jego zdolności? Aby to zrobić, musisz przydzielić nowy plasterek i skopiować zawartość starego plastra do nowego. (Funkcja „kopiuj” inny wbudowane.)
t := make([]int, len(s), 20)
copy(t, s)
Effective Go document trwa w tym przykładzie trochę dalej, realizując funkcję załącza dołącza jednego przedziału do drugiego rozmiaru, jeśli to konieczne.
Plasterki są poparte tablicami; po utworzeniu() wycinka o określonej pojemności tablica o tej pojemności jest przydzielana w tle. Wycinek efektywnie staje się "inteligentnym wskaźnikiem" dla tej tablicy. Jeśli przekażecie ten wycinek (lub podsystem tego wycinka) do innej funkcji, zostanie on przekazany jako wskaźnik do tej samej tablicy. To sprawia, że subpiksele są bardzo tanie - tworzenie alokacji tablicy jest kosztowne.
Standardowa biblioteka Go zawiera wiele pakietów kontenerowych - na przykład wektor - które eliminują potrzebę ręcznego zarządzania plasterkami. Użyj plasterków dla szybkości i bardziej rozbudowanych klas kontenerów dla wygody. (Mówiąc to, nadal używam plasterków do większości rzeczy.)
Być może zastanawiasz się, dlaczego musisz iść na te wszystkie kłopoty. W końcu wiele języków udostępnia dynamicznie przeskalowane tablice jako prymitywy. Powód tego jest związany z filozofią Go. Projektanci języków nie zakładają, że wiedzą, jaka jest właściwa polityka alokacji dla twojego programu; zamiast tego oferują narzędzia potrzebne do tworzenia własnych struktur danych.
W pogłębionej lektury: https://blog.golang.org/go-slices-usage-and-internals – user