myfun() *int {
var n = 10
return &n
}
func main() {
var p = myfun()
*p=10
fmt.Println(*p)
}
таким образом я получил указатель на переменную, объявленную внутри функции и использовал его после выхода из ее области видимости и по идее (как было бы в c++) уже после завершения lifetime этой переменной, то есть в c++ это было бы undefined behavior. Но go спокойно выполняет такую функцию и указатель валиден и его можно разыменовывать и никаких варнингов. Почему так?
escape analysis 🙂 в Go, в отличии от C++ (где RAII), можно возвращать указатели
Сборщик мусора удаляет когда нет больше ссылок на переменную, а у вас есть.
В го есть сборщик мусора, escape analysis лишь определяет можно ли положить переменную на стек или нужно складывать в хип и управлять сборщиком
Посмотри Rust, там всё это есть на более продвинутом уровне, чем в C++. В Go всё иначе из-за GC
https://go.dev/doc/gc-guide по качану (с) авторы Гоу
Обсуждают сегодня