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ă
s := []int{10, 20, 30}
fmt.Println(len(s), cap(s)) // 3 3Creare
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 appendappend: atribuiți întotdeauna rezultatul
append adaugă elemente și returnează o nouă felie (potențial
alocarea unei noi matrice dacă capacitatea este insuficientă):
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):
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
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:
out := make([]int, len(sub))
copy(out, sub)Încearcă
Creați o felie s cu [1, 2, 3] și utilizați append pentru a adăuga 4.
Afișează indiciu
Atribuiți ÎNTOTDEAUNA rezultatul anexării înapoi la `s`.
Soluție disponibilă după 3 încercări
Utilizați o expresie felie pentru a extrage elemente de la indexul 1 inclusiv la 3 exclusiv (adică [20, 30]).
Afișează indiciu
Sintaxă: `s[start:end]`, `start` inclusiv, `end` exclusiv.
Soluție disponibilă după 3 încercări
Care dintre acestea este GREȘIT să scrii?
s := []int{1, 2, 3}
// (a) s = append(s, 4)
// (b) append(s, 4)Recapitulare
[]T: vizualizare dinamică asupra unui tablou; triplu (ptr, len, cap).make([]T, len, cap)pentru a pre-aloca;var s []Tpentru 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.