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...)

Uruchom na placu zabaw Go

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

Uruchom go na play.golang.org

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ć -

  1. Utwórz plasterek źródłowy:
var sourceSlice []interface{} = []interface{}{"Hello",5.10,"World",true}
  1. Utwórz docelowy plasterek za pomocą:
  • Długość = długość sourceSlice
var destinationSlice []interface{} = make([]interface{},len(sourceSlice))
  1. 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)
}

Idź na plac zabaw

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.")
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow