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}
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}
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