Sobes.tech
Junior

Ինչպես աշխատել slices-ների հետ Go-ում?

sobes.tech AI

Պատասխան AI-ից

Սլայսները Go-ում չեն զանգվածներ, այլ հղումներ են բազային զանգվածի հատվածին (կամ ամբողջին): Դրանք դինամիկ տվյալների կառուցվածքներ են:

Սլայսի ստեղծում:

  • Զանգվածից:
    // զանգվածի սահմանում
    arr := [5]int{1, 2, 3, 4, 5}
    // սլայս ստեղծում մասից
    s1 := arr[1:4] // s1 պարունակում է arr[1], arr[2], arr[3]
    s2 := arr[:3]  // s2 պարունակում է arr[0], arr[1], arr[2]
    s3 := arr[2:]  // s3 պարունակում է arr[2], arr[3], arr[4]
    s4 := arr[:]   // s4 հղում է ամբողջ զանգվածին
    
  • make-ով:
    // Սլայս ստեղծում՝ երկարությամբ 5 և ծավալով 5
    s := make([]int, 5)
    // Սլայս ստեղծում՝ երկարությամբ 5 և ծավալով 10
    s_cap := make([]int, 5, 10)
    
  • Լիտերալով:
    s := []int{1, 2, 3}
    

Սլայսի հիմնական հատկությունները:

  • len(s): վերադարձնում է ներկայիս երկարությունը:
  • cap(s): վերադարձնում է ծավալը՝ առավելագույն քանակը, որը կարող է տեղավորվել նախքան reallocation:

Զգուշացում՝ ավելացում (append):

s := []int{1, 2}
s = append(s, 3)      // ավելացնում է մեկ էլեմենտ
s = append(s, 4, 5)   // ավելացնում է մի քանի էլեմենտ
s2 := []int{6, 7}
s = append(s, s2...) // ավելացնում է այլ սլայսի էլեմենտները

append-ը կարող է առաջացնել բազային զանգվածի reallocation, եթե ծավալը բավարար չէ:

Էլեմենտների հեռացում:

Էլեմենտների հեռացումը կատարվում է նոր սլայս ստեղծելով մնացած էլեմենտներից կամ պատճենելով:

s := []int{1, 2, 3, 4, 5}
// Էլեմենտի հեռացում ըստ ինդեքսի i
i := 2 // հեռացնում է ինդեքսով 2 էլեմենտը (այսինքն 3)
s = append(s[:i], s[i+1:]...)

Սլայսների պատճենում:

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src) // պատճենում է src-ից dst-ին

copy-ը պատճենում է նվազագույնը երկու սլայսների երկարություններից:

Իտերատիվ անցում սլայսով:

s := []string{"a", "b", "c"}
for i, v := range s {
    // i - ինդեքս, v - արժեք
}
for i := range s {
    // միայն ինդեքս
}
for _, v := range s {
    // միայն արժեք
}

Սլայսները՝ հղումային տիպեր:

Փոփոխությունները սլայսում արտացոլվում են բազային զանգվածում և մյուս սլայսներում, որոնք հղում են նույն հիշողության տարածքին:

arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:4] // [2, 3, 4]
s2 := arr[2:5] // [3, 4, 5]

s1[0] = 99
// Այժմ arr: [1, 99, 3, 4, 5]
// s1: [99, 3, 4]
// s2: [3, 4, 5] (էլեմենտը arr[2] փոխվեց)