Самые распространённые типы данных в Go: в чём разница?

Go, также известный как Golang, вошёл в топ-5 самых популярных языков программирования в различных областях благодаря своей простоте, эффективности и удобству использования. В этой статье мы расскажем, какие бывают типы данных в Golang, а также представим рекомендации для их выбора.

Особенности Golang

Go (Golang) – это многопоточный язык программирования от Google. Он обеспечивает высокую производительность и эффективность исполнения программ без необходимости в большом объеме ресурсов.

Для обеспечения высокой производительности и безопасности серверных приложений актуальна аренда сервера с Windows Server. Выделенные серверы обладают мощными ресурсами, достаточными для обработки различных типов данных в Golang. Они могут легко масштабироваться в зависимости от растущих потребностей проекта. а высочайший уровень защиты данных, гарантируя, что ваше приложение и конфиденциальная информация будут надежно защищены.

Компилируемый язык Go объединяет в себе достоинства своих конкурентов: он простой, как Python, и быстрый, как C и C++. Можно даже создавать графические интерфейсы, однако пока работать с ними не очень удобно.

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

Кроме того, в нём есть собственная система управления памятью, где сборщик мусора удаляет всё лишнее и освобождает место, устраняя необходимость вручную управлять этим процессом. Также в Go удобно отслеживать устаревшие конструкции, возможно автоматическое форматирование программ и документации.

Ещё одним преимуществом считается широкая экосистема инструментов и библиотек. Существует огромное количество сторонних библиотек и фреймворков для создания сложных приложений с дополнительными функциональными возможностями. Кроме этого, Go предлагает ряд инструментов для автоматизации сборки, тестирования и развертывания приложений.

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

Основные типы данных в Go

В Go каждая переменная имеет определенный тип данных, он не может быть изменен во время выполнения программы.

  1. Базовые типы данных

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

К базовым относятся 4 типа.

Целочисленные типы данных

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

Наиболее распространенным типом данных считается int. Также доступны uint8, uint16, uint32 и uint64, они нужны для работы с положительными числами и имеют ограничения по максимальному значению.

Есть специальные типы данных, такие как byte и rune.

  • Byte фактически представляет беззнаковый целочисленный тип uint8, применяемый для представления символов ASCII.
  • Rune является знаковым целочисленным типом int32, который используется для работы с юникод-символами и может представлять любой символ из множества юникода.

Какой тип данных выбрать, зависит от конкретной задачи. Если нам важна экономия памяти, а значения не превысят пределы определенного типа, то лучше использовать тип с меньшим диапазоном, чтобы сэкономить память. При необходимости работы с большими числами или отрицательными значениями подходит int64 или int, чтобы обеспечить достаточный диапазон.

Попробуем их объявить.

var x int16 = 45000

var y uint = 73000

var z byte = 4

Вещественные типы данных

Так называют числовые значения для работы с дробными числами. В Go поддерживаются два таких типа: float32 и float64.

Тип float32 представляет собой 32-битное вещественное число и обеспечивает достаточную точность для большинства требований. Однако, когда требуется более высокая точность, можно использовать тип float64 – 64-битное вещественное число. Этот тип обеспечивает большую точность и больший диапазон значений.

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

Их объявление происходит так.

var x float32 = 3.14

var y float64 = 3.1415926535897

Строковые типы данных в Go

Они позволяют работать с последовательностями символов. Основным из них считается string – неизменная последовательность символов, которую по правилам синтаксиса нужно заключать в двойные кавычки. То есть после того, как вы создали строку, менять в ней ничего нельзя. Вместо этого, операции над строками создают новые строки, которые содержат результат операции.

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

\n — перевод строки.

\t — табуляция.

\" — двойная кавычка.

\' — одинарная кавычка.

\\ — обратный слеш.

Объявим переменную.

var exampleText1 string = "Hello, user1!"

exampleText2 := "Hello, user2!"

Логический тип данных bool

Такие данные считаются фундаментальным компонентом языка и представляет возможность представления двух состояний: истины (true) и лжи (false). Он является базовым для реализации логических выражений, управления потоком выполнения программы, а также хранения и передачи сведений о булевых значениях.

Ознакомьтесь в примером применения этого типа.

age := 18

isAdult := age >= 18

fmt.Println(isAdult)

  1. Составные типы данных

Они предоставляют возможность создавать сложные и структурированные структуры данных. Они делятся ещё на 4 вида.

Массивы в Go

Массивы – это наборы элементов определенного типа, расположенных в памяти последовательно. Они имеют фиксированную длину и размер, задаваемые в момент их объявления.

Тип элемента и количество элементов указывается в квадратных скобках.

var exampleArr [4]int = [4]int{2, 5, 7, 9}

Доступ к его элементам выполняется по индексу, причём первым будет 0.

fmt.Println(exampleArr[0])

Итерацию можно делать с помощью цикла for.

for i := 0; i < len(exampleArr); i++ {

  fmt.Println(exampleArr[i])

}

Срезы (Slices) в Go

Более гибким аналогом массивов являются срезы (slices). Они являются динамическими структурами данных, которые представляют часть или всю последовательность элементов массива. С их помощью можно добавлять или удалять элементы, изменять их размер и осуществлять другие операции над данными.

Определим срез. В данном случае T — это тип элементов среза, а slice — переменная с ссылкой на срез.

var slice []T

Объявление пустого среза выглядит иначе.

emptySlice := []int{}

Функция make формирует срез с указанной длиной.

slice := make([]int, 5)

Структуры

Структура (structure) представляет собой совокупность различных полей, каждое из которых имеет собственное имя и тип. Такая организация позволяет логически группировать данные и связанные с ними операции.

Попробуем создать структуру со сведениями о сотруднике:

type Person struct {

  Name string

  Age int

  Address string

}

В нашем случае ключевое слово type, после него идёт название структуры, а в фигурных скобках – определение.

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

var person1 Person

person1 = Person{Name: "Inan", Age: 28, Address: "400 Main St."}

Оператор точки (.) определяет доступ к полям структуры. Попробуем узнать имя person1. person1.Name

Карты

Карты (Maps) в Golang – это структуры данных, хранящие пары ключ-значение. Они обеспечивают быстрый доступ к значениям по ключу.

Создание и инициализация карты происходит с помощью функции make(). Вот простой пример пустой карты с ключами string и значениями int.

m := make(map[string]int)

Добавим в неё элемент.

m[key] = value

В нашем варианте key — ключ элемента, а value — значение элемента.

m["cupcake"] = 3

m["chocolate"] = 5

Попробуем узнать значение элемента по ключу.

value := m[key]

Допустим, наш ключ – cupcake.

count := m["cupcake "]

Когда в карте отсутствует элемент с заданным ключом, возвращается значение по умолчанию.

Функция delete() исключает элемент из карты, например, так.

delete(m, "cupcake ")

Интерфейсы и указатели

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

Определим интерфейс Writer с методом Writer и аргументом типа []byte. Он возвращает число записанных байтов и ошибку.

type Writer interface {

  Write([]byte) (int, error)

}

Указатели – тип данных с адресом значения в памяти. Благодаря им можно изменять значения переменных вне функции или метода, что делает работу с данными более эффективной и гибкой.

Работа ведётся с непосредственно с памятью, где хранятся значения, а не с их копиями. Это позволяет избежать ненужного копирования данных и значительно повысить производительность программы.

Ниже пример работы с указателем.

var myInt int = 42

var myIntPointer *int = &myInt

fmt.Println(*myIntPointer)

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

Подведём итоги

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

Всё ещё остались вопросы?