Примеры массивов, срезов, карт и структур!

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.

Вот оно! Надеюсь, эта статья оказалась для вас полезной и вы узнали что-то новое. Если есть тема, о которой вы хотели бы узнать больше, пожалуйста, оставьте мне комментарий ниже! Спасибо за чтение.