Slice в Go
Slice очень похож на массив, но мощнее и гибче.
Он тоже хранит много значений одного типа в одной переменной. Главное отличие — размер: slice может становиться длиннее или короче, когда вам это нужно, а массив не может.
Есть несколько вариантов создать его:
- Записать значения напрямую, в форме
[]datatype{values} - Вырезать slice из существующего массива
- Вызвать функцию
make()
Создание slice с помощью []datatype{values}
Самый прямой способ объявить slice — перечислить его значения в фигурных скобках, как показывает синтаксис.
Две встроенные функции сообщают сведения о любом slice. len() возвращает его длину, то есть количество элементов, которые он сейчас содержит. cap() возвращает его ёмкость, то есть количество элементов, для которых в нём есть место.
Пример
Оба slice ниже записаны в этой форме. В первом нет значений, поэтому его длина и ёмкость равны 0; во втором четыре значения, поэтому обе равны 4:
Вывод: Программа на Go и захваченный вывод
package main
import ("fmt")
func main() {
myslice1 := []int{}
fmt.Println(len(myslice1))
fmt.Println(cap(myslice1))
fmt.Println(myslice1)
myslice2 := []string{"Слайсы", "Go", "Очень", "Мощные"}
fmt.Println(len(myslice2))
fmt.Println(cap(myslice2))
fmt.Println(myslice2)
}
Синтаксис
slice_name := []datatype{values}
Создание slice из массива
Другой вариант — взять часть массива, указав начальную и конечную позиции в квадратных скобках.
Пример
arr1[2:4] охватывает элементы от индекса 2 до индекса 4, не включая его. Ёмкость равна 4, потому что начиная с индекса 2 в массиве остаётся четыре элемента:
Вывод: Программа на Go и захваченный вывод
package main
import ("fmt")
func main() {
arr1 := [6]int{10, 11, 12, 13, 14, 15}
myslice := arr1[2:4]
fmt.Printf("myslice = %v\n", myslice)
fmt.Printf("длина = %d\n", len(myslice))
fmt.Printf("ёмкость = %d\n", cap(myslice))
}
Синтаксис
var myarray = [length]datatype{values} // An array
myslice := myarray[start:end] // A slice made from the array
Создание slice с помощью функции make()
Вызов make() — третий способ получить slice, и он позволяет выбрать длину и ёмкость.
Примечание: ёмкость необязательна. Если её опустить, она получит то же значение, что и длина.
Пример
myslice1 получает длину 5 и ёмкость 10. В myslice2 ёмкость не указана, поэтому обе величины равны 5:
Вывод: Программа на Go и захваченный вывод
package main
import ("fmt")
func main() {
myslice1 := make([]int, 5, 10)
fmt.Printf("myslice1 = %v\n", myslice1)
fmt.Printf("длина = %d\n", len(myslice1))
fmt.Printf("ёмкость = %d\n", cap(myslice1))
// с опущенной ёмкостью
myslice2 := make([]int, 5)
fmt.Printf("myslice2 = %v\n", myslice2)
fmt.Printf("длина = %d\n", len(myslice2))
fmt.Printf("ёмкость = %d\n", cap(myslice2))
}
Синтаксис
slice_name := make([]type, length, capacity)