Блог группы Marpa3D.
На основании размышлений Russ Cox.
Многие программисты часто просто применяют языковые конструкции не задумываясь о том, а как значения Go выглядят в памяти? Это нужно понимать, чтобы сформировать правильное представление о том, какие операции являются дорогостоящими, а какие нет. Эта статья посвящена базовым типам и структурам, массивам и срезам.
Основные типы
Посмотрим на пример:
Переменная i имеет тип int, представленные в памяти в виде одного 32-разрядного слова. (На всех этих рисунках показано 32-разрядное расположение памяти.)
Переменная j имеет тип int32 из-за явного преобразования. Даже несмотря на то , что i и j имеют одинаковую структуру памяти, но имеют разные типы: назначение i = j является ошибкой типа и должна быть записана с явным преобразованием: i = int(j).
Переменная f имеет тип float, которые текущие реализации представляют как 32-разрядное значение с плавающей запятой. Он занимает тот же объем памяти, что и int32 но другой внутренний макет.
Структуры и указатели
Идем дальше. В Go все решает тип! Переменная byte имеет тип [5]byte, представляющий собой массив из пяти элементов. Его расположение в памяти - 5 байт, следующие один за другим, непрерывно. То же самое с массивом primes, только у него 4 элемента.
Go, как и C, дает программисту контроль над тем, что является указателем, а что нет. Например, это определение типа:
type Point struct { X, Y int }
определяет простой структурный тип с именем Point, представленный в виде двух смежных int (целые числа) в памяти.
Point{10, 20} обозначает инициализированный Point. Взятие адреса составного литерала обозначает указатель на только что выделенный и инициализированный Point. p - это два слова в памяти; pp - указатель на два слова в памяти.
Поля в структуре располагаются рядом в памяти.
type Rect1 struct { Min, Max Point }
type Rect2 struct { Min, Max *Point }
Для более глубокого погружения в структуры данных рекомендую прочитать краткий цикл наших статей об этом!
Продолжение следует... Читайте нас дальше!)
Подробнее о нас на сайте marpa.su