Указатели в Go: отличия от C/C++
Вопрос
Как работают указатели в Go? Чем они отличаются от указателей в C/C++? Что такое escape analysis?
Ответ
Указатели в Go: - Безопасны - нет арифметики указателей - Автоматическое управление памятью (GC) - Нельзя получить указатель на указатель - Разыменование происходит автоматически для методов Отличия от C/C++: - Нет pointer arithmetic - Нет ручного освобождения памяти - Нет NULL указателей (только nil) - Статическая проверка на этапе компиляции
type Person struct {
Name string
Age int
}
func updateAge(p *Person, newAge int) {
p.Age = newAge // автоматическое разыменование
}
func main() {
person := Person{Name: "John", Age: 25}
// Получение указателя
ptr := &person
// Escape analysis определит, где размещать:
// стек или куча
updateAge(ptr, 26)
}
type Person struct {
Name string
Age int
}
func updateAge(p *Person, newAge int) {
p.Age = newAge // автоматическое разыменование
}
func main() {
person := Person{Name: "John", Age: 25}
// Получение указателя
ptr := &person
// Escape analysis определит, где размещать:
// стек или куча
updateAge(ptr, 26)
}
Дополнительные вопросы
Как escape analysis влияет на производительность? Как посмотреть результаты анализа?