Sobes.tech
Junior

როგორ მუშაობს სლაისები Go-ში?

sobes.tech AI

პასუხი AI-სგან

Слайс — бу массив өстөн җиңел капчык. Ул үзенең мәгълүматны сакламый, ә төп массивка сылтама ясый.

Слайс структурасы:

  • Төп массивка сылтама: Памятьта беренче элементның адресы.
  • Озынлык (Length): Слайста элементлар саны.
  • Капаситет (Capacity): Төп массивта, слайс күрсәткән урыннан башлап, мөмкин булган элементлар саны.
// Слайс декларациясе мисалы
var s []int
s = append(s, 1, 2, 3) // Элементлар өстәү

// Слайс sнең эчке күренеше (гади)
// struct SliceHeader {
//     Data uintptr // Төп массивка сылтама
//     Len int      // Слайсның озынлыгы
//     Cap int      // Капаситет
// }
  • make([]T, length, capacity) ярдәмендә слайс төзелгәндә, билгеле капаситет белән төп массив төзелә һәм ул сылтамалы була.
  • arr[low:high:max] кебек кисемтә кулланганда, яңа слайс төзелә, ул шул ук төп массивның өлешенә сылтама ясый, ләкин башка сылтама, озынлык һәм капаситет белән.
  • append операциясе хәтерне яңадан бүлүгә китерергә мөмкин. Әгәр хәзерге капаситет яңа элементлар өстәү өчен җитмәсә, Go яңа, зуррак төп массив төзеп, аңа иске массивның элементларын күчерә һәм сылтаманы яңарта. Бу reallocation дип атала.
  • Слайслар кыйммәтләр аша тапшырыла, ләкин алар төп массивка сылтама эчтәлегенә ия булганлыктан, алардагы үзгәрешләр (индекс аша) барлык сылтамаларда күренә.
  • Слайсның озынлыгын кисемтә аша үзгәртү төп массивны үзгәртми, ләкин төп массивның өлешләренә керүне чикли ала.
Үзенчәлек Озынлык (Length) Капаситет (Capacity)
Тасвирламасы Слайста чынбарлыкта булган элементлар саны Максималь элементлар саны, яңадан бүлү булмыйча
Керү s[i] аша элементларга керү append аша өстәлгәндә, күпме элемент өстәргә мөмкинлеген билгели
Алыну len(s) cap(s)
// Капаситет һәм озынлык белән эшләү мисалы
s := make([]int, 0, 5) // Озынлык 0, капаситет 5
fmt.Println(len(s), cap(s)) // 0 5

s = append(s, 1, 2) // Ике элемент өстәү
fmt.Println(len(s), cap(s)) // 2 5

s = append(s, 3, 4, 5, 6) // Тагын дүрт элемент өстәү, яңадан бүлү кирәк
fmt.Println(len(s), cap(s)) // 6 10 (капаситет артты)