Treci la conținutul principal

Extragerea părților dintr-o colecție

Uneori nu ai nevoie de un slice întreg. Ai nevoie doar de o parte din el: un interval de elemente, primele sau ultimele câteva, bucăți de aceeași mărime sau o fereastră mobilă de vecini.

Alte limbaje au metode pentru liste, cum ar fi slice, take, drop, chunked și windowed. Go nu are aceste metode. În schimb, Go are o expresie de slice: s[low:high] dă elementele de la indexul low până la indexul high, fără a-l include pe acesta. Omite low ca să începi de la început sau omite high ca să mergi până la sfârșit.

O expresie de slice nu copiază nimic. Slice-ul nou împarte memoria cu cel original. Dacă schimbi un element din parte, se schimbă și originalul. Când ai nevoie de o copie independentă, folosește slices.Clone() din pachetul slices.

Pentru lucrurile pe care o expresie de slice nu le poate face singură, această lecție folosește o buclă for, pachetul slices sau o mică funcție helper generică.

Majoritatea exemplelor de pe această pagină folosesc aceleași date: cuvintele one two three four five six.

Sintaxa expresiei de slice

Cele trei forme cel mai des întâlnite. n este un număr de elemente sau un index. Indexul de sfârșit nu este niciodată inclus.

main.go
s[low:high]   // elements from index low up to, but not including, high
s[:n]         // the first n elements
s[n:]         // everything from index n to the end

Feliere (slice)

Felierea înseamnă a lua elementele aflate pe anumite poziții alese.

Pentru o serie de poziții vecine, folosește o expresie de slice: words[1:4] dă elementele de la indexurile 1, 2 și 3. Ține minte că indexul de sfârșit este exclus: ca să obții elementele de la indexurile 1 până la 3 scrii 1:4.

O expresie de slice nu poate sări peste elemente. Ca să iei fiecare al doilea element sau elementele de pe poziții alese de tine, folosește o buclă for și adaugă cu append() fiecare element ales într-un slice nou.

Felierea unui interval

words[1:4] începe la indexul 1 și se oprește înainte de indexul 4. Rezultatul are 3 elemente.

Prompt
Fă un slice cu cuvintele one, two, three, four, five, six. Folosește o expresie de slice ca să iei elementele de la indexul 1 până la indexul 4, fără a-l include pe acesta. Afișează rezultatul.
Ieșire: program Go și rezultatul capturat
Slice a range

Feliere cu pas

Ca să iei fiecare al doilea element, o buclă for cu i += 2 trece prin indexurile 0, 2 și 4 și adună cuvintele.

Prompt
Fă un slice cu cuvintele one, two, three, four, five, six. Folosește o buclă for care merge de la indexul 0 până la indexul 4 din 2 în 2 și adaugă fiecare element într-un slice nou. Afișează rezultatul.
Ieșire: program Go și rezultatul capturat
Slice with a step

Feliere după o listă de indici

Pozițiile 3, 5 și 0 sunt păstrate într-un slice de int. Bucla alege cuvântul de pe fiecare poziție, așa că rezultatul iese în ordinea indicilor.

Prompt
Fă un slice cu cuvintele one, two, three, four, five, six și un slice cu indicii 3, 5, 0. Parcurge indicii și adună cuvintele de pe acele poziții, în acea ordine. Afișează rezultatul.
Ieșire: program Go și rezultatul capturat
Slice by a list of indices

Take și Drop

Take înseamnă să păstrezi un anumit număr de elemente de la un capăt. Drop înseamnă să arunci un anumit număr de elemente de la un capăt și să păstrezi restul.

Amândouă sunt expresii de slice în Go. words[:3] ia primele 3 elemente, iar words[len(words)-3:] ia ultimele 3. words[1:] elimină primul element, iar words[:len(words)-5] elimină ultimele 5.

Există și variante condiționale: takeWhile, takeLastWhile, dropWhile și dropLastWhile. Acestea nu numără elementele. Ele merg de la un capăt și se opresc la primul element care nu trece de condiție. Go nu are variante încorporate, așa că o mică funcție helper generică face treaba: găsește indexul la care condiția nu mai este adevărată și returnează o expresie de slice de la acel index.

Ia primele sau ultimele n elemente

words[:3] păstrează primele 3 cuvinte. words[len(words)-3:] păstrează ultimele 3.

Prompt
Fă un slice cu cuvintele one, two, three, four, five, six. Folosește expresii de slice ca să obții primele 3 elemente și ultimele 3 elemente. Afișează ambele rezultate pe linii separate.
Ieșire: program Go și rezultatul capturat
Take the first or last n elements

Elimină primele sau ultimele n elemente

words[1:] sare peste primul cuvânt. words[:len(words)-5] sare peste ultimele 5 cuvinte, așa că rămâne doar one.

Prompt
Fă un slice cu cuvintele one, two, three, four, five, six. Folosește expresii de slice ca să obții tot în afară de primul element și tot în afară de ultimele 5 elemente. Afișează ambele rezultate pe linii separate.
Ieșire: program Go și rezultatul capturat
Drop the first or last n elements

Ia cât timp o condiție este adevărată

TakeWhile păstrează cuvintele de la început până când întâlnește un cuvânt care începe cu f. TakeLastWhile păstrează cuvintele de la sfârșit până când întâlnește three. strings.HasPrefix() verifică începutul unui șir.

Prompt
Scrie funcții helper generice TakeWhile și TakeLastWhile care primesc un slice și o funcție de condiție. TakeWhile păstrează elementele de la început cât timp condiția este adevărată; TakeLastWhile face același lucru de la sfârșit. Folosește-le pe cuvintele one, two, three, four, five, six: păstrează de la început cât timp cuvântul nu începe cu f și păstrează de la sfârșit cât timp cuvântul nu este three. Afișează ambele rezultate.
Ieșire: program Go și rezultatul capturat
Take while a condition holds

Elimină cât timp o condiție este adevărată

DropWhile sare peste cuvintele de 3 litere de la început și păstrează tot de la three încolo. DropLastWhile sare peste cuvintele de la sfârșit cât timp acestea conțin litera i. strings.Contains() verifică dacă un șir conține o bucată de text.

Prompt
Scrie funcții helper generice DropWhile și DropLastWhile care primesc un slice și o funcție de condiție. DropWhile sare peste elementele de la început cât timp condiția este adevărată și păstrează restul; DropLastWhile face același lucru de la sfârșit. Folosește-le pe cuvintele one, two, three, four, five, six: sari peste cele de la început cât timp cuvântul are 3 litere și sari peste cele de la sfârșit cât timp cuvântul conține litera i. Afișează ambele rezultate.
Ieșire: program Go și rezultatul capturat
Drop while a condition holds

Chunked (bucăți)

Împărțirea în bucăți înseamnă tăierea unui slice în bucăți de aceeași mărime. Ultima bucată poate fi mai scurtă atunci când elementele nu se împart exact.

Go are asta încorporat începând cu versiunea 1.23: slices.Chunk(s, n). Nu returnează direct un slice de slice-uri. Returnează un iterator, care îți dă bucățile una câte una într-o buclă for range. Folosește slices.Collect() ca să aduni toate bucățile într-un [][]int.

Ca să lucrezi imediat pe fiecare bucată, parcurge bucățile și fă treaba în interiorul buclei.

Împărțire în bucăți de câte 3

Numerele de la 0 la 13 sunt tăiate în bucăți de câte 3. Ultima bucată are doar 2 elemente.

Prompt
Fă un slice cu numerele de la 0 la 13. Folosește slices.Chunk ca să îl împarți în bucăți de câte 3 și slices.Collect ca să aduni bucățile într-un slice de slice-uri. Afișează rezultatul.
Ieșire: program Go și rezultatul capturat
Split into chunks of 3

Suma fiecărei bucăți

Aceleași bucăți, dar fiecare este adunată în interiorul buclei. Se păstrează doar sumele.

Prompt
Fă un slice cu numerele de la 0 la 13. Parcurge slices.Chunk cu o mărime a bucății de 3, adună numerele din fiecare bucată și adaugă suma într-un slice nou. Afișează slice-ul cu sume.
Ieșire: program Go și rezultatul capturat
Sum each chunk

Windowed (ferestre)

O fereastră este un grup de elemente vecine. Parcurgerea cu ferestre mută grupul de-a lungul slice-ului și adună fiecare poziție. Spre deosebire de bucăți, ferestrele se suprapun.

Go nu are windowed încorporat. O buclă for cu o expresie de slice items[i:i+size] face asta. O mică funcție helper generică Windowed o face reutilizabilă. Cu un step, fereastra se mută cu mai multe poziții odată. Cu partial setat pe true, o fereastră mai scurtă de la sfârșit este păstrată în loc să fie aruncată.

O fereastră de 2 care se mută cu 1 pas este același lucru cu împerecherea fiecărui element cu următorul. În Go este o buclă care se oprește cu un element înainte de sfârșit.

Ferestre de câte 3

Fereastra are 3 cuvinte și se mută cu 1 poziție de fiecare dată. Bucla se oprește când o fereastră întreagă nu mai încape.

Prompt
Scrie o funcție helper generică Windowed care primește un slice și o mărime de fereastră și returnează fiecare grup cu atâtea elemente vecine, mutându-se cu o poziție de fiecare dată. Folosește-o cu mărimea 3 pe cuvintele one, two, three, four, five. Afișează rezultatul.
Ieșire: program Go și rezultatul capturat
Windows of 3

Ferestre cu pas și ferestre parțiale

Fereastra are 3 numere și se mută cu 2 poziții de fiecare dată. Pentru că partial este true, ultima fereastră [9 10] este păstrată chiar dacă este scurtă.

Prompt
Scrie o funcție helper generică Windowed care primește un slice, o mărime de fereastră, un pas și un indicator partial. Se mută cu step poziții între ferestre, iar când partial este true păstrează și o fereastră mai scurtă la sfârșit. Folosește-o pe numerele de la 1 la 10 cu mărimea 3, pasul 2 și partial setat pe true. Afișează rezultatul.
Ieșire: program Go și rezultatul capturat
Windows with a step and partial windows

Suma fiecărei ferestre

Fiecare fereastră de 3 vecini este adunată. Se păstrează doar sumele.

Prompt
Fă un slice cu numerele de la 1 la 5. Parcurge fiecare fereastră de 3 elemente vecine, adună numerele din fereastră și adaugă suma într-un slice nou. Afișează slice-ul cu sume.
Ieșire: program Go și rezultatul capturat
Sum each window

Împerecherea fiecărui element cu următorul

Prima buclă construiește un Pair din fiecare cuvânt și vecinul său. A doua buclă compară aceiași vecini și notează dacă primul cuvânt este mai lung decât al doilea.

Prompt
Fă un slice cu cuvintele one, two, three, four, five. Parcurge slice-ul și împerechează fiecare element cu cel de după el, folosind un mic struct Pair, și afișează slice-ul de perechi. Apoi parcurge din nou și, pentru fiecare pereche de vecini, notează dacă primul cuvânt este mai lung decât al doilea. Afișează slice-ul de valori booleene.
Ieșire: program Go și rezultatul capturat
Pair each element with the next one