Szukaj…
Wprowadzenie
Plasterek to struktura danych, która obudowuje tablicę, dzięki czemu programiści mogą dodawać tyle elementów, ile potrzeba, bez martwienia się o zarządzanie pamięcią. Plasterki można bardzo wydajnie pociąć na pod-wycinki, ponieważ wszystkie powstałe wycinki wskazują na ten sam wewnętrzny układ. Programiści Go często wykorzystują to, aby uniknąć kopiowania tablic, co zwykle odbywa się w wielu innych językach programowania.
Składnia
- slice: = make ([] type, len, cap) // utwórz nowy plasterek
- slice = append (slice, item) // dołącz element do plasterka
- plasterek = dołącz (plasterek, przedmioty ...) // dołącz plasterek przedmiotów do plastra
- len: = len (slice) // pobierz długość plasterka
- cap: = cap (slice) // uzyskaj pojemność plasterka
- elNum: = copy (dst, slice) // skopiuj zawartość wycinka do innego wycinka
Dołączanie do plasterka
slice = append(slice, "hello", "world")
Dodanie dwóch plasterków razem
slice1 := []string{"!"}
slice2 := []string{"Hello", "world"}
slice := append(slice1, slice2...)
Usuwanie elementów / plasterków „Krojenie”
Jeśli musisz usunąć jeden lub więcej elementów z wycinka lub jeśli chcesz pracować z pod wycięciem innego istniejącego; możesz użyć następującej metody.
Poniższe przykłady używają wycinka int, ale działa to z każdym rodzajem wycinka.
Do tego potrzebujemy plasterka, z którego usuniemy niektóre elementy:
slice := []int{1, 2, 3, 4, 5, 6}
// > [1 2 3 4 5 6]
Potrzebujemy również indeksów elementów do usunięcia:
// index of first element to remove (corresponding to the '3' in the slice)
var first = 2
// index of last element to remove (corresponding to the '5' in the slice)
var last = 4
Możemy więc „pokroić” plasterek, usuwając niepożądane elementy:
// keeping elements from start to 'first element to remove' (not keeping first to remove),
// removing elements from 'first element to remove' to 'last element to remove'
// and keeping all others elements to the end of the slice
newSlice1 := append(slice[:first], slice[last+1:]...)
// > [1 2 6]
// you can do using directly numbers instead of variables
newSlice2 := append(slice[:2], slice[5:]...)
// > [1 2 6]
// Another way to do the same
newSlice3 := slice[:first + copy(slice[first:], slice[last+1:])]
// > [1 2 6]
// same that newSlice3 with hard coded indexes (without use of variables)
newSlice4 := slice[:2 + copy(slice[2:], slice[5:])]
// > [1 2 6]
Aby usunąć tylko jeden element, wystarczy umieścić indeks tego elementu jako pierwszy ORAZ jako ostatni indeks do usunięcia, tak jak poniżej:
var indexToRemove = 3
newSlice5 := append(slice[:indexToRemove], slice[indexToRemove+1:]...)
// > [1 2 3 5 6]
// hard-coded version:
newSlice5 := append(slice[:3], slice[4:]...)
// > [1 2 3 5 6]
Możesz także usunąć elementy z początku wycinka:
newSlice6 := append(slice[:0], slice[last+1:]...)
// > [6]
// That can be simplified into
newSlice6 := slice[last+1:]
// > [6]
Możesz także usunąć niektóre elementy z końca wycinka:
newSlice7 := append(slice[:first], slice[first+1:len(slice)-1]...)
// > [1 2]
// That can be simplified into
newSlice7 := slice[:first]
// > [1 2]
Jeśli nowy plasterek musi zawierać dokładnie te same elementy, co pierwszy, możesz użyć tego samego, ale z
last := first-1
.
(Może to być przydatne, jeśli indeksy zostały wcześniej obliczone)
Długość i pojemność
Plastry mają zarówno długość, jak i pojemność. Długość wycinka to liczba elementów znajdujących się obecnie w wycinku, natomiast pojemność to liczba elementów, które wycinek może pomieścić przed koniecznością przeniesienia.
Podczas tworzenia wycinka za pomocą wbudowanej funkcji make()
można określić jego długość i opcjonalnie pojemność. Jeśli pojemność nie zostanie wyraźnie określona, będzie to określona długość.
var s = make([]int, 3, 5) // length 3, capacity 5
Możesz sprawdzić długość wycinka za pomocą wbudowanej funkcji len()
:
var n = len(s) // n == 3
Możesz sprawdzić pojemność za pomocą wbudowanej funkcji cap()
:
var c = cap(s) // c == 5
Elementy utworzone przez make()
są ustawione na zero dla typu elementu wycinka:
for idx, val := range s {
fmt.Println(idx, val)
}
// output:
// 0 0
// 1 0
// 2 0
Nie można uzyskać dostępu do elementów przekraczających długość wycinka, nawet jeśli indeks mieści się w zakresie pojemności:
var x = s[3] // panic: runtime error: index out of range
Jednak dopóki pojemność przekracza długość, możesz dodawać nowe elementy bez ponownego przydzielania:
var t = []int{3, 4}
s = append(s, t) // s is now []int{0, 0, 0, 3, 4}
n = len(s) // n == 5
c = cap(s) // c == 5
Jeśli dodasz do plastra, który nie ma zdolności do zaakceptowania nowych elementów, podstawowa tablica zostanie przeniesiona dla Ciebie z wystarczającą pojemnością:
var u = []int{5, 6}
s = append(s, u) // s is now []int{0, 0, 0, 3, 4, 5, 6}
n = len(s) // n == 7
c = cap(s) // c > 5
Dlatego ogólnie dobrą praktyką jest przydzielanie wystarczającej pojemności przy pierwszym tworzeniu wycinka, jeśli wiesz, ile miejsca potrzebujesz, aby uniknąć niepotrzebnych przesunięć.
Kopiowanie zawartości z jednego wycinka na inny wycinek
Jeśli chcesz skopiować zawartość wycinka do początkowo pustego wycinka, możesz wykonać następujące kroki, aby to zrobić -
- Utwórz plasterek źródłowy:
var sourceSlice []interface{} = []interface{}{"Hello",5.10,"World",true}
- Utwórz docelowy plasterek za pomocą:
- Długość = długość sourceSlice
var destinationSlice []interface{} = make([]interface{},len(sourceSlice))
- Teraz, gdy podstawowa tablica wycinka docelowego jest wystarczająco duża, aby pomieścić wszystkie elementy wycinka źródłowego, możemy przystąpić do kopiowania elementów za pomocą wbudowanej
copy
:
copy(destinationSlice,sourceSlice)
Tworzenie plasterków
Plasterki to typowy sposób, w jaki programiści przechowują listy danych.
Aby zadeklarować zmienną plasterka, użyj składni []Type
.
var a []int
Aby zadeklarować i zainicjować zmienną plasterka w jednym wierszu, użyj składni []Type{values}
.
var a []int = []int{3, 1, 4, 1, 5, 9}
Innym sposobem na zainicjowanie wycinka jest funkcja make
. To trzy argumenty: Type
wycinka (lub mapy ), length
i capacity
.
a := make([]int, 0, 5)
Możesz dodawać elementy do nowego plasterka za pomocą append
.
a = append(a, 5)
Sprawdź liczbę elementów w plasterku za pomocą len
.
length := len(a)
Sprawdź pojemność swojego plastra za pomocą cap
. Pojemność to liczba elementów, które obecnie są przydzielone do pamięci dla plasterka. Zawsze możesz dołączyć do plasterka, ponieważ Go automatycznie utworzy dla Ciebie większy plaster.
capacity := cap(a)
Możesz uzyskać dostęp do elementów w wycinku, używając typowej składni indeksowania.
a[0] // Gets the first member of `a`
Możesz także użyć pętli for
nad plasterkami z range
. Pierwsza zmienna to indeks w podanej tablicy, a druga zmienna to wartość indeksu.
for index, value := range a {
fmt.Println("Index: " + index + " Value: " + value) // Prints "Index: 0 Value: 5" (and continues until end of slice)
}
Filtrowanie plasterka
Aby przefiltrować plasterek bez przydzielania nowej podstawowej tablicy:
// Our base slice
slice := []int{ 1, 2, 3, 4 }
// Create a zero-length slice with the same underlying array
tmp := slice[:0]
for _, v := range slice {
if v % 2 == 0 {
// Append desired values to slice
tmp = append(tmp, v)
}
}
// (Optional) Reassign the slice
slice = tmp // [2, 4]
Zero wartości plastra
Wartość zerowa wycinka wynosi nil
, która ma długość i pojemność 0
. Wycinek nil
nie ma podstawowej tablicy. Ale są też inne niż zero plastry długości i pojemności 0
, takie jak []int{}
lub make([]int, 5)[5:]
.
Każdy typ, który ma wartości zerowe, można przekonwertować na wycinek nil
:
s = []int(nil)
Aby sprawdzić, czy plasterek jest pusty, użyj:
if len(s) == 0 {
fmt.Ptintf("s is empty.")
}