Junior
Ի՞նչ է հիմնական տարբերությունը slices և arrays-ի միջև Go-ում։
sobes.tech AI
Պատասխան AI-ից
Սլայսները՝ դա դինամիկ փոփոխվող զանգվածների տեսք են։
| Գծագիր | Զանգված (Array) | Սլայս (Slice) |
|---|---|---|
| Մակերես | Ֆիքս, որոշվում է ստեղծման ժամանակ | Դինամիկ, կարող է փոխվել |
| Տիպ | [n]T (որտեղ n չափսն է, T տիպը) |
[]T (որտեղ T տիպն է) |
| Փոխանցում ֆունկցիաներին | Քանի որ արժեքով (կոպիա) | Քանի որ հղումով՝ փոխանցվում է head, len և cap (իրականում, ստեղծվում է նոր SliceHeader կառուցվածք՝ այդ դաշտերի կոպիաներով) |
| Ստեղծում | var a [5]int կամ b := [3]string{"a", "b", "c"} |
var s []int կամ t := []int{1, 2, 3} կամ u := make([]int, 5) |
| Արժեքների կատարողականություն | Ավելի կանխատեսելի՝ ֆիքսված չափսի պատճառով, կարող է ավելի արդյունավետ լինել փոքր չափսերի դեպքում | Կարող է ունենալ ավել ծախսեր չափսի փոփոխության ժամանակ (միավոր զանգվածի վերաօտարամտում) |
// Զանգվածի օրինակ
var arr [3]int = [3]int{1, 2, 3}
// Զանգվածից ստեղծված սլայսի օրինակ
slice := arr[1:] // slice {2, 3}
// Սլայս ստեղծելու օրինակ
s := []int{10, 20, 30} // ենթակառուցված զանգված {10, 20, 30}, երկարություն = 3, ծավալ = 3
// Սլայսի փոփոխություն
s = append(s, 40) // հիմա s {10, 20, 30, 40}. Եթե ծավալը բավարար չէ, կստեղծվի նոր ենթակառուցված զանգված, երկարություն = 4, ծավալ = 6 (հաճախ կրկնապատկում է ծավալը)
// Էլեմենտի փոփոխությունը սլայսում փոխում է ենթակառուցված զանգվածը
slice[0] = 99 // arr այժմ {1, 99, 3}
fmt.Println(arr)