Серия учебных курсов DevOps in Go
В своей прошлой статье DevOps в Go — Переменные я рассказал о разных способах объявления переменных Go и о том, почему переменная Go должна иметь четкую границу памяти, указав тип переменной. Давайте сегодня рассмотрим основные типы данных Go.
Перейти к типам данных
Типы данных Go можно условно разделить на три типа:
- Основные типы данных
- Сложные типы данных
- Типы данных интерфейса
Базовые типы данных чаще всего используются один из трех.
Основной тип данных
Перейти к целочисленному типу
Целочисленный тип в основном используется для выражения целого числа в реальном мире, такого как возраст, год и т. д. Его можно разделить на независимые от платформы целочисленные типы и зависимые от платформы целые типы. сильные> целочисленные типы.
Основное различие между независимыми от платформы и зависимыми от платформы заключается в том, являются ли эти целые типы одинаковыми для разных архитектур ЦП или операционных систем.
В следующей таблице показаны независимые от платформы целочисленные типы Go:
Для целочисленных типов, зависящих от платформы, у нас есть int
, uint
и uintptr
:
Поскольку int
, uint
и uintptr
зависят от платформы, поэтому, когда мы пишем код, требующий переносимости, мы не должны полагаться на длину этих типов. Если вы не знаете длину этих трех типов на целевой операционной платформе, вы можете получить ее с помощью функции SizeOf
, предоставляемой пакетом unsafe. Например, на платформе x86–64 их длина равна 8:
var a, b = int(5), uint(6) var p uintptr = 0x12345678 fmt.Println("signed integer a's length is", unsafe.Sizeof(a)) // 8 fmt.Println("unsigned integer b's length is", unsafe.Sizeof(b)) // 8 fmt.Println("uintptr's length is", unsafe.Sizeof(p)) // 8
Целочисленный литерал
Go унаследовал грамматическую форму языка программирования C от числового литерала (Number Literal). Ранние версии Go поддерживают десятичные, восьмеричные и шестнадцатеричные числовые формы, такие как:
a := 53 // Decimal b := 0700 // Octal,"0" prefix c1 := 0xaabbcc // Hex,"0x" prefix c2 := 0Xddeeff // Hex,"0X" prefix
После Go v1.13 было добавлено следующее:
d1 := 0b10000001 // binary,"0b" prefix
d2 := 0B10000001 // binary,"0B" prefix
e1 := 0o700 // Octal,"0o" prefix
e2 := 0O700 // Octal,"0O" prefixa := 5uintptr
7 // Decimal: 537
b := 0b_1000_0111 // Binary 10000111
c1 := 0_700 // Octal: 0700
c2 := 0o_700 // Octal: 0700
d1 := 0x_5c_6d // Hex:0x5c6d
Вы также можете использовать пакет fmt
для преобразования целого числа в другой формат при выводе:
var a int8 = 59 fmt.Printf("%b\n", a) // binary:111011 fmt.Printf("%d\n", a) // decimal:59 fmt.Printf("%o\n", a) // octal:73 fmt.Printf("%O\n", a) // octal with 0o prefix:0o73 fmt.Printf("%x\n", a) // Hex:3b fmt.Printf("%X\n", a) // Hex:3B
Плавающая запятая
По сравнению с целочисленными типами сценарии использования типов с плавающей запятой относительно сфокусированы, в основном, в области научных численных вычислений, обработки и моделирования графики и изображений, мультимедийных игр и искусственного интеллекта.
float32 против float64
Go предоставляет два типа с плавающей запятой, float32
и float64
, которые соответственно соответствуют числовым типам с плавающей запятой одинарной и двойной точности в IEEE 754.
Однако здесь следует отметить, что тип float
не предусмотрен в языке Go. Это не похоже на целые типы. Go предоставляет как int16
, int32
, так и другие типы, а также типы int. Другими словами, типы с плавающей запятой, предоставляемые Go, независимы от платформы.
Будь то float32
или float64
, значение их переменных по умолчанию равно 0,0. Разница в том, что объем памяти, который они занимают, и диапазон/точность чисел с плавающей запятой.
Разговор float
с binary
довольно сложен, я не буду здесь вдаваться в подробности, но если вам интересно, вы можете обратиться к «Конвертер с плавающей запятой IEEE-754».
Опять же, вы можете просто использовать пакет fmt
для удобства.
func main() { var f float32 = 139.8125 bits := math.Float32bits(f) fmt.Printf("%b\n", bits) }Output: 1000011000010111101000000000000
Литерал числа с плавающей запятой
Литеральные значения типа Go с плавающей запятой можно условно разделить на две категории, одна из которых представляет собой форму значения с плавающей запятой:
3.1415 .15 81.80 82.
Другая форма научной записи:
6674.28e-2 // 6674.28 * 10^(-2) = 66.742800 .12345E+5 // 0.12345 * 10^5 = 12345.000000
Как и int
, пакет fmt
также обеспечивает вывод с плавающей запятой:
var f float64 = 123.45678 fmt.Printf("%f\n", f) // 123.456780fmt.Printf("%e\n", f) // 1.234568e+02 fmt.Printf("%x\n", f) // 0x1.edd3be22e5de1p+06
Сложный тип данных
Числа вида z=a+bi
называются комплексными числами. Язык Go изначально поддерживает типы комплексных чисел. Однако по сравнению с целочисленными типами и типами с плавающей запятой применение типов комплексных чисел в Go более ограничено и в основном используется для вычислений в профессиональных областях, таких как векторные вычисления.
Go предоставляет два типа комплексных чисел: complex64
и complex128
. Если комплексный номер не имеет назначенного типа, то его тип по умолчанию — complex128
.
В Go есть три способа представления комплексных чисел:
- Непосредственно инициализируйте переменную комплексного числа:
var c = 5 + 6i var d = 0o123 + .12345E+5i // 83+12345i
- Используйте функцию
complext
var c = complex(5, 6) // 5 + 6i var d = complex(0o123, .12345E+5) // 83+12345i
- Используйте
real
иimag
:
var c = complex(5, 6) // 5 + 6i r := real(c) // 5.000000 i := imag(c) // 6.000000