Skip to content

Slices

Arrays

var arr [256]int // фиксированная длина 
var arr [10][10]string // может быть многомерным 
arr := [...]int{1, 2, 3} // автоматический подсчет длины 
arr := [10]int{1, 2, 3, 4, 5}

Slices

var s []int // не-инициализированный слайс, nil 
s := []int{} // с помощью литерала слайса 
s := make([]int, 3) // с помощью функции make, s == {0,0,0}

Go slices internals

// runtime/slice.go 
type slice struct { array unsafe.Pointer len int cap int } 

l := len(s) // len — вернуть длину слайса 
c := cap(s) // cap — вернуть емкость слайса 
s := make([]int, 3, 10) // s == {0,0,0}
https://go.dev/blog/slices-intro

Add element to slice

s = append(s, 1) // добавляет 1 в конец слайса 
s = append(s, 1, 2, 3) // добавляет 1, 2, 3 в конец слайса 
s = append(s, s2...) // добавляет содержимое слайса s2 в конец 
s var s []int // s == nil 
s = append(s, 1) // s == {1} append умеет работать с nil-слайсами

Get sub slices

s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s2 := s[3:5] // {3,4}
s2 := s[3:] // {3,4,5,6,7,8,9}
s2 := s[:5] // {0,1,2,3,4} 
s2 := s[:] // копия s (shallow) {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Когда мы создаем подслайс он ссылается на тот же массив. Когда мы создаем слайс используя append и добавляем элементы помещающиеся в capacity изначального слайса , то новый слайс будет ссылаться на тот же массив что и изначальный слайс.
arr := []int{1, 2} arr2 := arr // копируется только заголовок, массив остался общий 
arr2[0] = 42 fmt.Println(arr[0]) // 42
arr2 = append(arr2, 3, 4, 5, 6, 7, 8) // реаллокация 
arr2[0] = 1 fmt.Println(arr[0]) // 42

Copy slice

s := []int{1,2,3} s2 := make([]int, len(s)) copy(s2, s)

Sort

s := []int{3, 2, 1} sort.Ints(s)
s := []string{"hello", "cruel", "world"} sort.Strings(s)
type User struct { 
    Name string 
    Age int 
} 
func main() { 
    s := []User{ {"vasya", 19}, {"petya", 18},} 
    sort.Slice(s, func(i, j int) bool { 
        return s[i].Age < s[j].Age 
    }) 
    fmt.Println(s)
}

Operation with slices, delete element, add element in the middle

https://github.com/golang/go/wiki/SliceTricks