Мы говорили о базовых типах данных в моем предыдущем посте. Помимо базовых типов, в Go также есть составные типы. Составные типы комбинируют базовые типы различными способами и поддерживаются встроенными функциями Go. Тогда давайте углубимся!
Массивы
Массивы представляют собой последовательности фиксированной длины элементов определенного типа. Все элементы массива должны быть объявленного типа.
Существует несколько различных типов объявлений массивов, которые показаны выше. Когда у вас есть начальные значения массива, вы можете объявить свой массив с помощью литералов массива, как в строке 7. Также, если у вас есть начальные значения, вы можете объявить свой массив без указания размера массива. . В строке 16 […] означает, что длина массива определяется количеством инициализаторов. Однако, если у вас нет начальных значений, вы можете объявить массив, как в строке 10, и элементы массива будут установлены в нулевое значение для типа элемента. Если вы хотите описать массив, элементы которого имеют нулевое значение, но не все (разреженный массив), вы можете объявить его, как в строке 19. Все индексы, кроме указанных, будут установлены в нулевое значение.
Встроенная функция len возвращает количество элементов в массиве. Вы можете считывать значения из массива или записывать новые значения в массив с помощью индексов. Когда вы запустите приведенный выше код, вы получите этот результат.
[0 1 2 3 4 5 6 7 8 9]
[0 0 0 0]
Турецкий
4
[false false false false true false false false true true]
Компилятор Go не может улавливать индексы за пределами границ, поэтому при попытке чтения или записи за пределами конца массива или отрицательного индекса вы получите ошибку выполнения (панику).
Массивы сопоставимы, поэтому мы можем сравнить два массива с помощью оператора ==, но эти два массива должны иметь одинаковый тип элемента и размер. Более того, преобразование типов невозможно между двумя массивами разной длины.
Функции получают копию значения каждого аргумента, назначенного в Go. Это означает, что функции влияют только на копию аргументов, а не на оригинал (передача по значению). В этой области массивы похожи на другие типы, поэтому, когда вы передаете массив в качестве параметра функции, вы не можете получить доступ к измененному массиву за пределами области действия функции. Однако, если вы передаете указатель на массив, вы можете изменить массив и получить его измененную версию.
Массив внутри умножить с двумя функциями: [2 4 6 8 10]
Массив передается по значению: [1 2 3 4 5]
Массив внутри умножить с тремя функциями: [3 6 9 12 15]< br /> Массив передается по ссылке: [3 6 9 12 15]
Массивы редко используются непосредственно в Go из-за их фиксированной длины. Срезы работают более гибко, чем массивы.
Ломтики
Срезы похожи на массивы без указания размера. Срезы полезны тем, что у них нет ограничений, как у массивов, поэтому вам не нужно указывать размер среза. На самом деле работа со срезами имеет некоторое сходство с работой с массивами, потому что срезы основаны на массивах. Вы можете объявлять срезы как массивы, используя буквенные или нулевые значения, не вводя размер.
Срез состоит из трех компонентов: указатель, указывающий на первый элемент массива, длина, количество элементов среза и емкость. Встроенные функции len и cap возвращают эти значения.
append — это встроенная функция, добавляющая новые элементы в фрагменты. Он принимает срез и новый элемент в качестве параметра. С чем следует быть осторожным, так это с типом среза и элемента. Вы не можете добавить строковое значение в срез, который хранит значения int32. Каждый раз, когда вы добавляете к срезу, он увеличивает длину среза. Когда длина слайса равна емкости и вы добавляете в него новый элемент, новый слайс с большей емкостью.
Журналы после запуска этого кода:
81 добавляется к слайсу! Длина – 1, Емкость – 1
К фрагменту добавляется 87! Длина – 2, Емкость – 2
К фрагменту добавляется 47! Длина – 3, Емкость – 4
К фрагменту добавляется 59! Длина 4, Емкость 4
К срезу добавляется 81! Длина 5, Емкость 8
К срезу добавляется 18! Длина 6, Емкость 8
25 добавляется к срезу! Длина 7, Емкость 8
К срезу добавляется 40! Длина 8, Емкость 8
56 добавляется к фрагменту! Длина 9, Емкость 16
0 добавляется к срезу! Длина 10, Емкость 16
К срезу добавляется 94! Длина 11, Емкость 16
11 добавляется к фрагменту! Длина 12, Емкость 16
62 добавляется к слайсу! Длина 13, Емкость 16
К срезу добавляется 89! Длина 14, Емкость 16
28 добавляется к слайсу! Длина 15, Емкость 16
К слайсу добавляется 74! Длина 16, Емкость 16
К срезу добавляется 11! Длина 17, Вместимость 32
Среда выполнения Go предоставляет службы выделения памяти и сбора мусора, поэтому она выделяет новую память и копирует существующие данные из старой памяти в новую, когда заканчивается емкость. Потом чистит старую память.
Встроенная функция make — удобный способ объявить срез с длиной и емкостью. Это позволяет нам указать тип, длину и емкость, если мы хотим, конечно!
slice:= make([]тип, длина, вместимость)
В отличие от массивов, срезы влияют на то, когда они передаются в функцию по своему значению, потому что они уже имеют указатель. Это означает, что при копировании фрагмента создается псевдоним.
Разрез внутри умножения с двумя функциями: [2 4 6 8 10]
Разрез после умножения: [2 4 6 8 10]
Вы можете выполнить операцию среза, чтобы создать срез из среза, как операцию подстроки. Когда вы меняете элемент вложенного слайса, родительский слайс будет изменен, потому что, когда вы создаете вложенный слайс из слайса, эти два слайса совместно используют одну и ту же память.
Срез внутри умножается на две функции: [2 4]
Срез внутри добавляет функцию случайных чисел: [3 4 5 1]
Срез внутри добавляет функцию случайных чисел: [3 4 7]
Срез представляет собой передается по значению: [2 4 3 4 7]
Длина среза равна 5, а последний элемент среза равен 7
Карты
Карты — это встроенные типы данных, предоставляемые Go для связывания одного значения с другим. Тип карты записывается map[keyType]valueType. Все ключи должны быть одного типа, и все значения должны быть одного типа. Карты нельзя сравнивать друг с другом, но можно сравнивать с ноль. Nil — это нулевое значение карт.
Вы можете объявить карту с определенным начальным размером, но если вы не уверены, сколько пар ключ-значение будет вставлено в карту, не беспокойтесь. Длина карты представляет собой количество пар ключ-значение, и встроенная функция len возвращает его. Длина увеличивается по мере добавления в карту новых пар ключ-значение.
Team5 добавлена в таблицу результатов с 56 очками!
Team2 уже находится в таблице очков с 45 очками!
карта[Team1:90 Team2:45 Team3:76 Team4:51 Team5:56]
Мы можем прочитать значение, назначенное ключу карты, поместив ключ в скобки, и он вернет два значения; второй — логическое значение, которое истинно, когда элемент присутствует. Если ключ не задан в карте, первое значение возвращает нулевое значение для типа значения карты. Проверка существования значения с помощью логического значения более надежна, поскольку первое возвращает действительное значение, даже если с ключом не связано существующее значение.
Go не предоставляет тип set , но вы можете имитировать его с помощью карт.
Мы сказали, что все значения должны быть одного типа в картах, поэтому это усложняет передачу данных из функции в функцию. Разработчики Go, которые не хотят сталкиваться с такими ограничениями, используют структуры.
Структуры
Структура — это совокупный тип данных, который обеспечивает группировку связанных данных в виде единой сущности. Тип структуры определяется ключевым словом type, именем типа структуры и ключевым словомstruct. Каждые данные в структуре являются полем, и вы можете получить доступ к этим полям с помощьюзаписи через точку.
Есть несколько важных моментов в объявлении структуры:
- Поля обычно записываются построчно. Имя поля, за которым следует тип данных поля. Если у вас есть поля с одинаковым типом данных, вы можете их объединить.
- Если вы хотите создать поле, которое экспортируется, оно должно начинаться с заглавной буквы.
- Структура не может содержать себя как поле, но указатель на структуру может быть полем.
- Вы можете объявить анонимную структуру, не указывая имя структуры.
Структуры сопоставимы, когда все их поля сопоставимы. Также значения структур могут быть переданы в качестве параметров функциям, и они могут быть возвращаемыми типами функций.
Долгота равна 5 Широта равна 9 для точки A
Долгота равна 2 Широта равна 5 для точки B
Расстояние между точкой A и точкой B равно 5.000000
Вы можете подумать, в чем разница между классами и структурами. Go не имеет наследственности. Это означает, что у Go другой подход к объектно-ориентированному программированию. Структуры — это типы значений, тогда как классы — это ссылочные типы. Структуры хранят свои значения в памяти, а классы хранят ссылки на объекты. Из-за этого структуры обычно обрабатываются указателями, как и массивы.
Наконец-то конец истории :) Спасибо за прочтение! Если у вас есть какие-либо отзывы, свяжитесь со мной, пожалуйста.
Рекомендации
- Изучение го. Идиоматический подход к реальному программированию на го, Уильям Кеннеди и Брайан Кетельсен, Джон Боднер.
- Язык программирования Go от Алана А. А. Донована и Брайана В. Кернигана.