Срезы
Срез - это концептуально структура с тремя полями:
- указатель на массив,
- длина,
- и емкость
Срезы поддерживают оператор []
для доступа к элементам базового массива.
- Встроенная функция len возвращает длину среза.
- Встроенная функция cap возвращает емкость.
Для данного массива или другого среза a новый срез создается через a[i:j].
- Это создает новый срез, который ссылается на a, начинается с индекса i и заканчивается перед индексом j.
- Имеет длину j - i.
- Если i не указан, срез начинается с 0.
- Если j опущен, срез заканчивается на len(a).
Новый срез ссылается на тот же массив, на который ссылается a. То есть изменения, внесенные в элементы с помощью нового среза, можно увидеть с помощью a.
Емкость нового среза - это просто емкость минус i. Емкость массива - это длина массива.
var s []int
var a [10]int
s = a[:] // сокращение от s = a[0:len(a)]
Если вы создаете значение типа [100]byte (массив из 100 байтов, возможно, буфер) и хотите передать его функции, не копируя его, объявите параметр функции как тип []byte и передайте срез массива. Срезы также можно создавать с помощью функции make, как описано ниже.
Срезы в сочетании со встроенной функцией append предлагают во многом те же функции, что и ArrayList в Java.
s0 := []int{1, 2}
s1 := append(s0, 3) // добавляем один элемент
s2 := append(s1, 4, 5) // добавляем несколько элементов
s3 := append(s2, s0...) // добавляем срез
Синтаксис среза также можно использовать со строкой. Он возвращает новую строку, значение которой является подстрокой исходной строки.
Создание значений
Значения карты и канала должны быть назначены с помощью встроенной функции make. Например, вызов
make(map[string]int)
возвращает вновь выделенное значение типа map[string]int.
В отличие от new, make возвращает фактический объект, а не адрес. Это согласуется с тем фактом, что карты и каналы являются ссылочными типами.
Для карт make принимает подсказку о емкости в качестве второго необязательного аргумента.
Для каналов есть необязательный второй аргумент, который устанавливает емкость буферизации канала; по умолчанию - 0 (без буферизации).
Функцию make также можно использовать для выделения среза. В этом случае он выделяет память для базового массива и возвращает срез, ссылающийся на него. Есть один обязательный аргумент - количество элементов в срезе. Второй необязательный аргумент - это емкость среза.
m := make([]int, 10, 20) // То же, что и new([20]int)[:10]
Читайте также:
- Go для Java разработчиков: Hello world пример
- Go для Java разработчиков: основные отличия Go
- Go для Java разработчиков: синтаксис
- Go для Java разработчиков: константы, структуры, указатели
- Основы Go: срезы (slices)
Комментариев нет:
Отправить комментарий