Я новачок у Go, і я відчуваю трохи консолідованого дисонансу між програмою, заснованою на стеці на стилі C, де автоматичні змінні живуть на стеці та виділеною пам’яттю живуть на купі та та програмуванням на основі стику Python, де Єдине, що живе на стеку - це посилання / покажчики на предмети на купі.
Наскільки я можу сказати, дві наступні функції дають однаковий вихід:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
тобто виділити нову структуру і повернути її.
Якби я написав це на C, перший би поставив предмет на купу, а другий поставив би його на стек. Перший поверне вказівник на купу, другий поверне вказівник на стек, який би випарувався до часу повернення функції, що було б поганою річчю.
Якби я написав це на Python (або багатьох інших сучасних мовах, крім C #), приклад 2 не був би можливим.
Я розумію, що Go сміття збирає обидва значення, тому обидві вищевказані форми чудово.
Цитувати:
Зауважте, що на відміну від C, цілком нормально повертати адресу локальної змінної; зберігання, пов'язане зі змінною, зберігається після повернення функції. Насправді, прийняття адреси складеного буквального тексту виділяє новий екземпляр кожного разу, коли він оцінюється, тому ми можемо поєднати ці два останні рядки.
Але це викликає пару питань.
1 - У прикладі 1 структура оголошена на купі. Що з прикладом 2? Це заявлене на стеці так само, як це було б у C, чи воно теж йде на купу?
2 - Якщо приклад 2 оголошений на стеці, як він залишається доступним після повернення функції?
3 - Якщо приклад 2 насправді оголошений на купі, то як структури передаються за значенням, а не за посиланням? Який сенс покажчиків у цьому випадку?