Примеры массивов, срезов, карт и структур!
Go стал известен своей богатой стандартной библиотекой и описывается как «батарейки в комплекте». На самом деле язык был разработан инженерами Google, которые устали от C++. Фактически, Go сочетает в себе желаемые черты нескольких языков, чтобы обеспечить гибкий и эффективный выбор, в частности, для веб-сервисов. Некоторые из его преимуществ включают в себя:
- Читабельность — ее можно сравнить с типизированной версией Python.
- Параллелизм — с помощью горутин
- Скорость — компиляция быстрая и эффективная
- Библиотеки — просты в использовании и широко применимы
- Память — встроена сборка мусора (больше никаких висящих указателей!)
Массивы в Go имеют фиксированный размер и соответствуют парадигме Go — вы можете выбрать явный для ясности или неявный для краткости.
var wizards [2]string // define an array of strings with length of 3 wizards[0] = "Ron Weasley" wizards[1] = "Harry Potter" // an abbreviated version wizards := [2]string{"Ron Weasley", "Harry Potter"} fmt.Println(wizards) // output: [Ron Weasley Harry Potter]
В любом случае мы определяем wizards
, синтаксис краток и точен. Это хорошая золотая середина между повторяющимся характером Java и простотой Python, при этом позволяя вам отслеживать ваши типы.
Срезы — это, по сути, динамическая версия массивов. На самом деле вы можете использовать массив для построения среза! Вот несколько примеров того, как индексировать с помощью слайсов, комментарии — это то, что было бы на выходе, если бы вы распечатали слайс.
kimboSliceMoves := [3]string{"JAB!", "HOOK!", "SLICE!"} // an array kimboSlice := kimboSliceMoves[:] // [JAB! HOOK! SLICE!] kimboSlice := kimboSliceMoves[:2] // [JAB! HOOK!] kimboSlice := kimboSliceMoves[1:] // [HOOK! SLICE!] kimboSlice := kimboSliceMoves[1:2] // [SLICE!]
Обратите внимание, что вы не можете запустить этот код, потому что Go на самом деле не позволяет переназначать переменные, если они не используются на каких-либо промежуточных шагах.
Мы также можем определить срез без использования массива фиксированной длины, а затем использовать метод append
для добавления в наш срез.
kimboSliceMoves := []string{"JAB!", "HOOK!", "SLICE!"} // no length kimboSliceMoves = append(kimboSliceMoves, "WHAM!", "BANG!")
Теперь наш срез состоит из пяти элементов. Как и Python, Go должен создать новый массив большего размера, чтобы затем скопировать существующий массив и новые элементы. Если вам нужна эффективность, лучше заранее определить массив до процесса добавления.
Карты — чрезвычайно полезная структура данных. Go определяет карты как пары ключ-значение, и вам нужно определить типы обоих. Затем вы можете определить свою карту так же, как с JSON.
treasure := map[string]string{ "gold chest": "gold key", "silver chest": "silver key", // notice we need a trailing comma }
Если бы мы хотели получить доступ к значению ключа в нашей карте, мы могли бы распечатать treasure["gold chest"]
, что дало бы нам "gold key"
. Вы также можете переназначить значение карты, например treasure["gold chest"] = "iron key"
. Если вы хотите уничтожить элемент, просто используйте для этого delete(treasure, "gold chest")
.
Структуры — это последний тип коллекций, который нам предстоит изучить. Поскольку Go не допускает наследования в традиционном объектно-ориентированном шаблоне, мы используем структуры для создания сложных типов данных и реализации интерфейсов. Структура — это, по сути, ваш проект нового объекта, который вы затем можете экземпляром превратить в объект для взаимодействия.
type wizard struct { Name string Age int WandCore string } var potter wizard fmt.Println(potter) // output: {0 []}
Если мы просто инициализируем структуру, ее свойства будут просто определены как пустые или нулевые. Вы можете либо назначить каждое свойство отдельно, либо определить их все сразу при инициализации.
potter := wizard{ Name: "Harry Potter", Age: 12, Wand: "Phoenix Feather", } fmt.Println(potter) // output: {Harry Potter 12 Phoenix Feather}
Обратите внимание, что структура будет ограничена областью действия, в которой вы ее определили. Если вы определяете структуру в main, она может быть инициализирована только в main.
Вот оно! Надеюсь, эта статья оказалась для вас полезной и вы узнали что-то новое. Если есть тема, о которой вы хотели бы узнать больше, пожалуйста, оставьте мне комментарий ниже! Спасибо за чтение.