Срезы

Последнее обновление: 21.12.2017

Срезы (slice) представляют последовательность элементов одного типа переменной длины. В отличие от массивов длина в срезах не иксирована и динамически может меняться, то есть можно добавлять новые элементы или удалять уже существующие.

Срез определяется также, как и массив, за тем исключением, что у него не указывается длина:

var users []string

Также срез можно инициализировать значениями:

var users = []string{"Tom", "Alice", "Kate"}
// или так
users2 := []string{"Tom", "Alice", "Kate"}

К элементам среза обращение происходит также, как и к элементам массива - по индексу и также мы можем перебирать все элементы с помощью цикла for:

var users []string = []string{"Tom", "Alice", "Kate"}
fmt.Println(users[2])	// Kate
users[2] = "Katherine"

for _, value := range users{
	fmt.Println(value)

С помощью функции make() можно создать срез из нескольких элементов, которые будут иметь значения по умолчанию:

var users []string = make([]string, 3)
users[0] = "Tom"
users[1] = "Alice"
users[2] = "Bob"

Добавление в срез

Для добавления в срез применяется встроенная функция append(slice, value). Первый параметр функции - срез, в который надо добавить, а второй параметр - значение, которое нужно добавить. Результатом функции является увеличенный срез.

users := []string{"Tom", "Alice", "Kate"}
users = append(users, "Bob")
	
for _, value := range users{
	fmt.Println(value)
}

Оператор среза

Оператор среза s[i:j] создает из последовательности s новый срез, который содержит элементы последовательности s с i по j-1. При этом должно соблюдаться условие 0 <= i <= j <= cap(s). В качестве исходной последовательности, из которой берутся элементы, может использоваться массив, указатель на массив или другой срез. В итоге в полученном срезе будет j-i элементов.

Если значение i не указано, то применяется по умолчанию значение 0. Если значение j не указано, то вместо него используется длина исходной последовательности s.

// исходный массив
initialUsers := [8]string{"Bob", "Alice", "Kate", "Sam", "Tom", "Paul", "Mike", "Robert"}
users1 := initialUsers[2:6]		// с 3-го по 6-й 
users2 := initialUsers[:4]		// с 1-го по 4-й
users3 := initialUsers[3:]		// с 4-го до конца
	
fmt.Println(users1)		// ["Kate", "Sam", "Tom", "Paul"]
fmt.Println(users2)		// ["Bob", "Alice", "Kate", "Sam"]
fmt.Println(users3)		// ["Sam", "Tom", "Paul", "Mike", "Robert"]

Удаление элемента

Что делать, если необходимо удалить какой-то определенный элемент? В этом случае мы можем комбинировать функцию append и оператор среза:

users := []string{"Bob", "Alice", "Kate", "Sam", "Tom", "Paul", "Mike", "Robert"}
//удаляем 4-й элемент
var n = 3
users = append(users[:n], users[n+1:]...)	
fmt.Println(users)		//["Bob", "Alice", "Kate", "Tom", "Paul", "Mike", "Robert"]
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850