Skip to content

Базовые типы и основные литералы значений

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

Встроенные базовые типы в Go

Go поддерживает следующие встроенные базовые типы:

  • Один логический встроенный тип: bool.
  • 11 встроенных целочисленных числовых типов: int8, uint8, int16, uint16, int32, uint32, int64, uint64, int, uint, и uintptr.
  • Два встроенных числовых типа с плавающей запятой: float32 и float64.
  • Два встроенных сложных числовых типа: complex64 и complex128.
  • Один встроенный строковый тип: string.

Каждый из 17 встроенных базовых типов принадлежит одному типу в Go. Мы можем использовать вышеуказанные встроенные типы в коде без импорта каких-либо пакетов, хотя все имена этих типов являются неэкспортируемыми идентификаторами

15 из 17 встроенных базовых типов являются числовыми. Числовые типы включают целые типы, типы с плавающей запятой и сложные типы. 

Go также поддерживает два встроенных алиаса типов:

  • byte является встроенным алиасом uint8. Мы можем рассматривать byte и uint8 как один и тот же тип.
  • rune является встроенным алиасом int32. Мы можем рассматривать rune и int32 как один и тот же тип. 

Целочисленные типы, имена которых начинаются с u (uint, uintptr), являются беззнаковыми типами. Значения беззнаковых типов всегда неотрицательны. Число в имени типа означает, сколько двоичных битов значение типа будет занимать в памяти во время выполнения. Например, каждое значение uint8 занимает в памяти 8 бит. Таким образом, наибольшее uint8 значение равно 255(2 8 -1), наибольшее int8 значение равно 127(2 7 -1), а наименьшее int8 значение равно -128(-2 7). 

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

Мы часто измеряем размер значения на основе количества байтов, которое оно занимает в памяти. Один байт содержит 8 бит. Таким образом, размер uint32 типа составляет 32/8 = 4 байта. 

Размер памяти uintptr и int значения uint зависят от реализации. Как правило, размер int и uint значения равны 4 для 32-разрядных архитектур и 8 для 64-разрядных архитектур. Размер uintptr значения должен быть достаточно большим, чтобы хранить неинтерпретированные биты любого адреса памяти. 

Действительная и мнимая части complex64 значения являются float32 значениями, а действительная и мнимая части complex128 значения являются float64 значениями. 

В памяти все числовые значения с плавающей запятой в Go хранятся в формате IEEE-754. 

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

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

Хотя для каждого из логических и строковых типов существует только один встроенный тип, мы можем определить собственные логические и строковые типы для встроенных логических и строковых типов. Таким образом, может быть много логических и строковых типов. То же самое правило действует для любых типов числовых типов. Ниже приведены  примеры объявления типов. В этих объявлениях слово type является ключевым словом. 

Мы можем вызывать пользовательский real тип, определенный выше, и встроенный float32 тип как типы float32. Обрати внимание, что второе слово float32 в последнем предложении является общей ссылкой, а первое — конкретной ссылкой. Точно так же MyString и string оба являются строковыми типами, status и bool оба являются логическими типами и т. д. 

Нулевые значения

Каждый тип имеет нулевое значение. Нулевое значение типа можно рассматривать как значение типа по умолчанию.

  • Нулевое значение логического типа равно false.
  • Нулевое значение числового типа равно нулю, хотя нули разных числовых типов могут иметь разный размер в памяти.
  • Нулевое значение строкового типа — это пустая строка.