Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: Go, interface, memory, runtime, fat pointer

Сколько памяти занимает один интерфейс в Go?

Проверяет понимание внутреннего представления интерфейсов в Go и их размера в памяти.

Короткий ответ

Интерфейс в Go занимает 16 байт (на 64-битных системах). Он состоит из двух указателей: один указывает на таблицу методов (itab), другой — на сами данные. Это позволяет интерфейсу хранить значение любого типа, реализующего его методы.

Длинный ответ

Внутреннее устройство интерфейса в Go

Интерфейс в Go — это не просто абстракция, а конкретная структура данных, которая хранится в памяти. На 64-битных системах каждый интерфейс занимает ровно 16 байт. Это связано с тем, что интерфейс состоит из двух указателей по 8 байт каждый.

Компоненты интерфейса

  • itab (interface table) — указатель на специальную структуру, которая содержит метаданные о типе и список методов, реализуемых этим типом для данного интерфейса.
  • data — указатель на сами данные, которые хранятся в интерфейсе. Если значение меньше или равно размеру указателя (8 байт), оно может храниться непосредственно в этом поле без дополнительного выделения памяти в куче.

Пример для наглядности

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var i interface{} = 42
	fmt.Println(unsafe.Sizeof(i)) // Выведет 16
}

В этом примере интерфейс i хранит целое число 42. Несмотря на то, что само число занимает 8 байт, интерфейс всё равно занимает 16 байт из-за дополнительного указателя на таблицу методов.

Практическое применение

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

Вывод: Интерфейсы в Go — это легковесные структуры фиксированного размера (16 байт), которые позволяют реализовать полиморфизм без значительных накладных расходов. Их стоит использовать для абстракции и гибкости кода, но с осторожностью при работе с большими объёмами данных.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#Go

#interface

#memory

#runtime

#fat pointer

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.