Sobes.tech
Junior

Jaký je klíčový rozdíl mezi slices a poli v Go?

sobes.tech AI

Odpověď od AI

Slicing je dynamicky měnitelný pohled na pole.

Charakteristika Array Slice
Velikost Fixní, určená při vytvoření Dynamická, může se měnit
Typ [n]T (kde n je velikost, T je typ) []T (kde T je typ)
Předání do funkcí Podle hodnoty (kopie) Podle odkazu na podkladové pole, předávají se head, len a cap (ve skutečnosti je vytvořena nová struktura SliceHeader s kopiemi těchto polí)
Vytvoření var a [5]int nebo b := [3]string{"a", "b", "c"} var s []int nebo t := []int{1, 2, 3} nebo u := make([]int, 5)
Výkon Předvídatelnější díky pevné velikosti, může být výhodnější u malých velikostí Může mít režii při změně velikosti (přerozdělení podkladového pole)
// Příklad pole
var arr [3]int = [3]int{1, 2, 3}

// Příklad slice vytvořeného z pole
slice := arr[1:] // slice {2, 3}

// Příklad vytvoření slice
s := []int{10, 20, 30} // podkladové pole {10, 20, 30}, délka = 3, kapacita = 3

// Změna slice
s = append(s, 40) // nyní s {10, 20, 30, 40}. Pokud kapacita nestačí, vytvoří se nové podkladové pole, délka = 4, kapacita = 6 (obvykle zdvojení kapacity).

// Změna prvku ve slice mění podkladové pole
slice[0] = 99 // arr nyní {1, 99, 3}
fmt.Println(arr)