Привет всем! Сегодня я расскажу о некоторых основных концепциях Go, в которых мы обсудим структуру данных стандартных блоков, то есть массивы и срезы.

Мы все привыкли знать, как работают массивы, и мы также используем эту структуру данных в большинстве наших проектов.

Поэтому я перефразирую его еще раз, чтобы понять массивы в Golang.

Массивы в Go

Массивы представляют собой элементы фиксированного размера и имеют непрерывную память, и они не могут уменьшаться и увеличиваться в размере. Некоторые преимущества использования массивов заключаются в том, что они имеют произвольный доступ и не требуют кэширования. Вот простое представление массива в Go.

var myArr [4]int
myArr[2] = 33
newArr := myArr
// newArr = 33

В Golang переменные явно объявляются и используются компилятором.
Представление [4]int в памяти в последовательном порядке:

Переменная массива обозначает весь массив, что означает, что присвоение переменной массива создаст копию его содержимого.

Он также может быть объявлен как:

values := [4]string{'John', 'Bob', 'Kyle', 'Jack'}
values := [...]string{'Austin', 'John'}

Вы, должно быть, думаете, что это за три точки в массиве […]?

Хорошо, есть небольшая разница между []string и […]string, []string — это не что иное, как массив строк. Строка — это синтаксис параметра, который делает его переменным параметром; он будет принимать 0 и более строковых значений и ссылаться на них как на срез. Таким образом, независимо от количества элементов в массиве, вы можете просто аннотировать его […], чтобы сделать его более динамичным.

Встроенная функция len обычно просто возвращает длину массива. Говоря о циклах, мы используем его для перебора массива одномерных и многомерных массивов, хотя есть еще один контролируемый способ, который Go предоставляет нам для обслуживания, есть ключевое слово диапазон , который повторяется так же, как и цикл for, но более элегантно и чисто. Диапазон с картами работает эффективно.

Некоторые ограничения использования массивов в Go:

  • Массивы в Go не изменяются по размеру и не являются динамическими.
  • Передавая массив функции в качестве параметра, вы передаете копию массива, а это означает, что любые изменения, которые вы будете делать внутри функции, будут потеряны после выполнения функции.
  • Передача большого массива в функцию может быть довольно медленной. Чтобы преодолеть эту неэффективность, в Go есть динамический массив, называемый слайсами, с помощью которого мы можем преодолеть все эти ограничения.

Слайсы в Go

Проще говоря, срезы — это динамические массивы. Они обеспечивают большую гибкость и эффективность по сравнению с массивами.

  • Срезы реализованы с использованием внутренних массивов, что означает, что Go использует базовый массив для каждого среза.
  • Срезы передаются по ссылке в функции, что означает передачу адреса памяти переменной среза. Любые изменения, которые вы будете вносить в слайс, не будут потеряны после выполнения функции.
  • Передача большого среза выполняется намного быстрее, чем передача в функцию обширного массива, потому что Go не придется копировать срез. Он просто передаст адрес памяти в переменную slice.

Литерал среза объявляется точно так же, как обычный массив в Go, только без количества элементов.

myIntSlices := []int{12, 45, 89, 90}
myStringSlices := []string{'John', 'Diana', 'Jess', 'Rachel'}

Срезы также можно создавать с помощью встроенной функции make.

randomSlice := make([]byte, 5, 5)
// randomSlice = []byte{0, 0, 0, 0, 0}

Необязательно передавать емкость в функцию make. Просто по умолчанию емкость будет принимать значения длины.

Внутренности срезов

Внутренняя часть слайсов состоит из указателя на массив, длины и емкости.

Длина:количество элементов, на которые ссылается срез.
Емкость:количество элементов в массиве.

Срезы также могут быть сформированы путем «повторного разрезания» массива или среза.

items := []int{1, 2, 3, 4, 5}
items[1:3] // {2, 3}
items[2:] // {3, 4, 5}
items[:3] // {1, 2, 3}
items[:] // {1, 2, 3, 4, 5

Примечание. Вы когда-нибудь задумывались, что означает эта нотация «? Она означает создание нового фрагмента, который ссылается на существующий фрагмент.

Таким образом, он создает новый фрагмент, который указывает на исходный фрагмент. Если изменение вновь созданного массива с помощью исходного массива или среза становится эффективным. Следовательно, он изменчив по своей природе.

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

Разрастание срезов

Копировать. Эта функция поддерживает копирование фрагментов разной длины. Встроенная функция копирования копирует минимальное количество элементов len(s2) и len(s1).

Функция копирования копирует данные из исходного фрагмента в целевой фрагмент и возвращает количество элементов, скопированных в целевой фрагмент.

Вот пример:

Добавить. Проще говоря, вы уже знаете, что это значит добавить что-то. Но в Go функция добавления означает добавление элементов, скажем, для x элементов в конец среза s, и она увеличивает срез, если емкость нужный.

Вот пример функции добавления на практике:

Такие функции, как append, обеспечивают полный контроль над ростом среза. Go показывает нам, что для увеличения среза нам нужно реализовать функцию добавления, а не ссылаться на несуществующий индекс. Это может привести к появлению сообщения об ошибке: panic: runtime error: index out of range.

Я думаю, вы, вероятно, получили представление о том, как реализовать массивы и срезы, когда и почему?

Спасибо, что дочитали до этого места. Если в этом посте есть какие-либо грубые ошибки, не стесняйтесь предлагать возможные изменения, необходимые для того, чтобы сделать этот пост более информативным. Это была просто краткая информация для ознакомления с концепциями go. Между тем, вы можете получить дополнительную информацию на официальном сайте блога Go: https://blog.golang.org/

Ссылки, на которые я ссылался:

https://blog.golang.org/slices-intro
Если вы хотите узнать больше о срезах, вы также можете проверить этот блог: https://blog.golang.org/slices

Книги, на которые я ссылался:

Освоение Go, Михалис Цукалос
Язык программирования Go, Алан А. А. Донован и Брайан В. Керниган