Указатели

Тема дорожной карты · Golang

Указатели в Go хранят адрес памяти значения и объявляются с типом *T; оператор & получает указатель на переменную, а оператор * обращается к значению по адресу. Указатели Go безопаснее, чем в C: арифметика указателей не допускается, сборщик мусора отслеживает все значения в куче, а nil-указатель является нулевым значением любого указательного типа, делая проверки на nil идиоматичными. Передача указателей в функции избавляет от копирования больших структур и позволяет функциям изменять данные вызывающего кода; канонический паттерн для мутаций структур — pointer receiver (func (s *Server) Start() error), тогда как небольшие неизменяемые типы нередко используют value receivers (func (p Point) String() string). Встроенный new(T) выделяет нулевое значение типа T в куче и возвращает *T, хотя указательные литералы структур (&Server{Addr: ":8080"}) более распространены в идиоматичном Golang-коде. Понимание указателей Go — в особенности того, как escape-анализ определяет, находится ли значение на стеке или в куче, — критически важно для написания кода с эффективным использованием памяти и интерпретации вывода go build -gcflags="-m" в производительно-чувствительных Golang-сервисах.

Как это работает

Указатели намеренно мал: ключевые слова (var, const, if, for, switch, defer, go, select, return, type, func, package, import), нет классов (struct + методы + интерфейсы), нет исключений (multi-return + error-значения), нет наследования (композиция через embedding). Видимость по регистру: с заглавной — экспорт, со строчной — package-private. := объявляет + присваивает; = — присваивает. defer выполняется при возврате функции — идеально для cleanup. Компилятор не пропустит неиспользуемые импорты + переменные.

Когда применять

Примите минимализм — Go дерётся с попытками умничать. gofmt (без флагов, канонический стиль); коммитьте только отформатированный код. defer — для cleanup в паре с захватом (defer f.Close() сразу после f, err := os.Open(...)). Короткое объявление (:=) внутри функций; var — для zero-valued объявлений или когда нужен конкретный тип.

Типичные ошибки

Ловушки Указатели: for i := range slice и получение и индекса и копии, когда хотели оба (for i, v := range slice); shadow внешних переменных через := ("почему внешняя переменная не изменилась?"); не обрабатывают ошибку немедленно (_, _ = ... игнорирует); глобальное состояние — Go-программы становятся сложными для понимания при shared mutable state.

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…