Зарегистрируйтесь, чтобы продолжить обучение

Возврат структур из функций Основы Go

В Go структура (struct) — это значение. Это означает, что при передаче или возврате структуры из функции она копируется. Такое поведение важно учитывать, особенно если структура большая или содержит поля, указывающие на изменяемые данные.

Возврат структуры по значению

Вы можете напрямую возвращать структуру из функции:

type User struct {
    Name string
    Age  int
}

func NewUser(name string, age int) User {
    return User{Name: name, Age: age}
}

func main() {
    user := NewUser("Alice", 30)
    fmt.Println(user.Name) // Alice
}

Здесь возвращается копия структуры User. Все поля копируются, и дальнейшие изменения переменной user в main() не затронут оригинальный объект, созданный внутри NewUser.

Возврат указателя на структуру

Иногда вместо копии удобнее вернуть указатель на структуру:

func NewUserPtr(name string, age int) *User {
    return &User{Name: name, Age: age}
}

Такой подход даёт:

  • Возможность изменять поля структуры вне функции.
  • Экономию памяти (особенно при работе с большими структурами).
  • Консистентность в стиле, если структура часто используется по ссылке.

Пример:

func main() {
    user := NewUserPtr("Bob", 25)
    user.Age++
    fmt.Println(user.Age) // => 26
}

Безопасность возврата указателя

Go автоматически размещает значения в куче, если они должны жить дольше области действия функции. Поэтому &User{...} — безопасно: компилятор гарантирует, что указатель не станет висячим (dangling pointer).

func NewUser() *User {
    u := User{Name: "Charlie", Age: 40}
    return &u // безопасно: Go поместит структуру в heap
}

Когда использовать что?

  • Возвращайте по значению, если структура небольшая и вы не планируете её менять.
  • Возвращайте указатель, если:
    • Структура содержит изменяемое состояние.
    • Нужно избежать лишнего копирования.
    • Вы хотите единообразие с методами, использующими указатель-приёмник.

Дополнительные материалы

  1. Pointers vs. Values

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff