четверг, 11 ноября 2021 г.

Go для Java разработчиков: срезы, создание значений

Срезы

Срез - это концептуально структура с тремя полями:

  • указатель на массив,
  • длина,
  • и емкость

Срезы поддерживают оператор [] для доступа к элементам базового массива.

  • Встроенная функция 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]


Читайте также:


Комментариев нет:

Отправить комментарий