Salt la conținutul principal
Modulul 4 · Lecția 2 din 517/50 în curs~15 min
Lecții din modul (2/5)

Felii: structura idiomatică

O slice este cea mai utilizată structură de date din Go: o vizualizare dinamică peste o matrice subiacentă. Sintaxă: []T. Spre deosebire de matrice, lungimea este nu face parte din tip și îl puteți crește cu append.

Anatomia unei felii

În interior, o felie este o structură cu trei câmpuri:

  • un pointer către primul element din tabloul de bază
  • a lungime (len): numărul de elemente vizibile
  • o capacitate (cap): elemente disponibile de la începutul vederii până la sfârșitul matricei de bază
Go
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3

Creare

Go
a := []int{1, 2, 3}          // literal
b := make([]int, 3)          // [0 0 0]   len=3 cap=3
c := make([]int, 3, 10)      // len=3 cap=10 (reserved)
var d []int                  // nil slice: len=0 cap=0, still usable with append

append: atribuiți întotdeauna rezultatul

append adaugă elemente și returnează o nouă felie (potențial alocarea unei noi matrice dacă capacitatea este insuficientă):

Go
s := []int{1, 2, 3}
s = append(s, 4)              // [1 2 3 4]
s = append(s, 5, 6, 7)        // append multiple elements
s = append(s, altra...)       // concatenate another slice (spread)

Expresie secțiune s[a:b]

Extrage o sub-slice de la a (inclusiv) la b (exclusiv):

Go
s := []int{10, 20, 30, 40, 50}
sub := s[1:4]              // [20 30 40]
inizio := s[:2]            // [10 20]
fine := s[3:]              // [40 50]
intera := s[:]             // [10 20 30 40 50]

Sub-slice partajează matricea de bază cu felia originală: mutațiile prin sub[i] = ... sunt vizibile și în s.

Capcană: partajarea matricei

Go
s := []int{1, 2, 3, 4}
sub := s[0:2]
sub[0] = 99
fmt.Println(s)             // [99 2 3 4] — modified!

Pentru a obține o copie independentă, utilizați copy sau append:

Go
out := make([]int, len(sub))
copy(out, sub)

Încearcă

Exercițiu#go.m4.l2.e1
Încercări: 0Se încarcă…

Creați o felie s cu [1, 2, 3] și utilizați append pentru a adăuga 4.

Se încarcă editorul...
Afișează indiciu

Atribuiți ÎNTOTDEAUNA rezultatul anexării înapoi la `s`.

Soluție disponibilă după 3 încercări

Exercițiu#go.m4.l2.e2
Încercări: 0Se încarcă…

Utilizați o expresie felie pentru a extrage elemente de la indexul 1 inclusiv la 3 exclusiv (adică [20, 30]).

Se încarcă editorul...
Afișează indiciu

Sintaxă: `s[start:end]`, `start` inclusiv, `end` exclusiv.

Soluție disponibilă după 3 încercări

Quiz#go.m4.l2.e3
Gata

Care dintre acestea este GREȘIT să scrii?

Go
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)
Opțiuni de răspuns

Recapitulare

  • []T: vizualizare dinamică asupra unui tablou; triplu (ptr, len, cap).
  • make([]T, len, cap) pentru a pre-aloca; var s []T pentru o porție nulă utilizabilă.
  • s = append(s, ...): atribuiți ÎNTOTDEAUNA rezultatul.
  • s[a:b] partajează matricea de bază: copy(...) pentru copii independente.
  • O felie nil = OK pentru a citi/interval/adăugare; destul de diferit de o hartă zero.