Я новичок в Go, и я испытываю немного противоречивого диссонанса между программированием на основе стека C-стиля, где в стек входят автоматические переменные и выделяет память в куче и в стиле Python, основанном на стеках, где единственное, что живет в стеке, - это ссылки/указатели на объекты в куче.Стек и распределение кучи структур в Go, и как они относятся к сборке мусора
Насколько я могу сказать, что две следующие функции дают одинаковый результат:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
т.е. выделить новую структуру и вернуть его.
Если бы я написал это на C, первый бы поставил объект в кучу, а второй положил бы его на стек. Первый вернет указатель на кучу, второй вернет указатель на стек, который бы испарился к тому времени, когда функция вернулась, что было бы Bad Thing.
Если бы я написал это на Python (или на многих других современных языках, кроме C#), то пример 2 не был бы возможен.
Получаю, что Go мусор собирает оба значения, поэтому обе эти формы в порядке.
Цитирую:
Обратите внимание, что, в отличие от C, это совершенно нормально, чтобы вернуть адрес локальной переменной ; хранилище, связанное с переменной, выживает после возвращения функции. Фактически, принимая адрес составного , литерал выделяет новый экземпляр каждый раз, когда он оценивается, поэтому мы можем объединить эти последние две строки.
Но возникает несколько вопросов.
1 - В примере 1 структура объявлена в куче. Как насчет примера 2? Это объявлено в стеке так же, как это было бы на C, или оно тоже будет на куче?
2 - Если в стеке объявлен пример 2, как он останется доступным после возвращения функции?
3 - Если пример 2 фактически объявлен в куче, то как это делается, что structs передается по значению, а не по ссылке? В чем смысл указателей в этом случае?
Отличное спасибо. Я действительно не спрашивал: «В чем смысл указателей вообще», это было больше похоже на «то, что точка указателей, когда значения, похоже, ведут себя как указатели», и этот случай в любом случае оказывается спорным. – Joe
Было бы полезно получить краткое объяснение сборки. – ElefEnt