Ответ
Использовать make
для создания экземпляров структур в Go нельзя. Это приведет к ошибке компиляции.
Функция make
предназначена только для трех встроенных типов:
- Слайсы (slices):
make([]int, 5, 10)
- Карты (maps):
make(map[string]int)
- Каналы (channels):
make(chan bool)
make
не просто выделяет память, но и инициализирует внутреннюю структуру этих типов данных.
Как правильно создавать структуры и где они размещаются?
Для создания структур используются композитные литералы или функция new
.
// Ошибка компиляции
// s := make(MyStruct)
// Правильные способы:
type MyStruct struct{ Value int }
s1 := MyStruct{} // Создание экземпляра. Может быть в стеке.
s2 := &MyStruct{} // Создание экземпляра и получение указателя. Скорее всего, в куче.
s3 := new(MyStruct) // Аналогично &MyStruct{}. Выделяет память и возвращает указатель. В куче.
Размещение в памяти: Стек или Куча?
Решение о том, где разместить переменную (в быстром стеке или в более медленной куче), принимает компилятор на этапе анализа побега (escape analysis).
- Стек: Если компилятор доказывает, что переменная используется только внутри одной функции и ее жизненный цикл не превышает время выполнения этой функции, она размещается в стеке.
- Куча (Heap): Если указатель на переменную может "сбежать" из функции (например, его возвращают из функции, передают в другую горутину или сохраняют в глобальной переменной), переменная будет размещена в куче, чтобы избежать ее преждевременного удаления. Программисту не нужно управлять этой памятью вручную, это делает сборщик мусора (GC).