Junior
Kā darbojas slices Go?
sobes.tech AI
Atbilde no AI
Slicing ir ir viegls pārvalks pār masīvu. Tas pats par sevi nesaglabā datus, bet norāda uz galveno masīvu.
Slicing struktūra:
- Norāde uz galveno masīvu: Adrese pirmā elementa atmiņā.
- Garums (Length): Elementu skaits slicing.
- Kapacitāte (Capacity): Elementu skaits galvenajā masīvā, pieejams no slicing norādes.
// Piemērs, kā deklarēt slicing
var s []int
s = append(s, 1, 2, 3) // Pievienot elementus
// Iekšējā slicing s reprezentācija (vienkāršota)
// struct SliceHeader {
// Data uintptr // Norāde uz galveno masīvu
// Len int // Slicing garums
// Cap int // Kapacitāte
// }
- Izveidojot slicing ar
make([]T, length, capacity), tiek izveidots galvenais masīvs ar norādīto kapacitāti un slicing, kas norāda uz to ar norādīto garumu. - Izmantojot griezumu no masīva vai cita slicing (piemēram,
arr[low:high:max]), tiek izveidots jauns slicing, kas norāda uz to pašu atmiņas apgabalu kā galvenais masīvs, bet ar citu norādi, garumu un kapacitāti. appendoperācija var novest pie atmiņas pārdalīšanas. Ja pašreizējā kapacitāte nav pietiekama jaunu elementu pievienošanai, Go izveido lielāku galveno masīvu, kopē tajā veco masīvu un atjaunina norādi uz jauno masīvu. To sauc par reallocation.- Slicing tiek nodots pēc vērtības, bet tā kā tas satur norādi uz galveno masīvu, izmaiņas elementos (caur indeksu) būs redzamas visos slicing, kas norāda uz to pašu galveno masīvu.
- Izmaiņas slicing garumā, izmantojot griezumu, neietekmē galveno masīvu, bet var ierobežot piekļuvi daļai datu no galvenā masīva.
| Īpašība | Garums (Length) | Kapacitāte (Capacity) |
|---|---|---|
| Definīcija | Faktiskais elementu skaits slicing | Maksimālais elementu skaits, kas var būt slicing bez reallocation |
| Piekļuve | Tiek izmantota piekļuvei elementiem (s[i]) | Nosaka, cik vēl elementu var pievienot ar append pirms reallocation |
| Iegūšana | len(s) |
cap(s) |
// Piemērs ar kapacitātes un garuma darbu
s := make([]int, 0, 5) // Garums 0, kapacitāte 5
fmt.Println(len(s), cap(s)) // 0 5
s = append(s, 1, 2) // Pievienot 2 elementus
fmt.Println(len(s), cap(s)) // 2 5
s = append(s, 3, 4, 5, 6) // Pievienot vēl 4 elementus, nepieciešama reallocation
fmt.Println(len(s), cap(s)) // 6 10 (kapacitāte palielinājās)