На этом шаге рассмотрим индексирование срезов и извлечение срезов из срезов в Go.
Срез – это ссылка на скрытый массив. И срез, извлеченный из среза, ссылается на тот же самый скрытый массив. Рассмотрим поясняющий пример:
s := []string{"0", "1", "2", "3", "4", "5", "6", "7"} t := s[2:6] fmt.Println(t, s, "=", s[:4], "+", s[4:]) s[3] = "x" t[len(t)-1] = "y" fmt.Println(t, s, "=", s[:4], "+", s[4:])
Архив примера можно взять здесь.
Результат работы программы представлен на рисунке 1.
Рис.1. Результат работы программы
При изменении данных посредством оригинальной переменной s или переменной t, полученной в результате извлечения среза из среза, изменяются одни и те же данные в памяти, то есть изменения затрагивают оба среза. Данный фрагмент также демонстрирует, что для данного среза s и индекса i (0 ≤ i ≤ len(s)) срез s равен конкатенации срезов s[:i] и s[i:].
На рис. 2 показан срез s, включая все допустимые позиции, и срезы, извлекаемые в фрагменте программного кода. Нумерация позиций в любом срезе начинается с 0, а последний элемент среза всегда имеет индекс len(s) - 1.
Рис.1. Устройство среза
На следующем шаге рассмотрим итерации по срезам в Go.