← Назад к вопросам

Как называется параметр, указываемый перед названием метода?

1.0 Junior🔥 251 комментариев
#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

В языке Go перед названием метода указывается параметр-приёмник (receiver parameter). Это ключевая концепция методов в Go, отличающая их от обычных функций.

Что такое параметр-приёмник?

Параметр-приёмник — это особый параметр, который связывает метод с конкретным типом (обычно структурой). Он определяет, на каком типе "живет" данный метод и через какое значение (оригинал или копия) он будет работать.

Синтаксис объявления метода

// Метод объявляется с параметром-приёмником перед именем метода
func (r ReceiverType) MethodName(parameters) returnType {
    // Тело метода
}

Конкретный пример:

type User struct {
    Name string
    Age  int
}

// Метод GetInfo связан с типом User через параметр-приёмник (u User)
func (u User) GetInfo() string {
    return fmt.Sprintf("Name: %s, Age: %d", u.Name, u.Age)
}

Типы параметров-приёмников

Существует два основных вида параметров-приёмников:

1. Приёмник по значению (value receiver)

func (u User) UpdateNameByValue(newName string) {
    u.Name = newName // Изменяется копия, оригинальная структура не меняется
}
  • Ключевая особенность: Метод получает копию структуры.
  • Следствие: Любые изменения внутри метода не затрагивают оригинальный объект.
  • Пример использования: Когда метод только читает данные или возвращает вычисленное значение.

2. Приёмник по ссылке (pointer receiver)

func (u *User) UpdateNameByPointer(newName string) {
    u.Name = newName // Изменяется оригинальная структура
}
  • Ключевая особенность: Метод получает ссылку (pointer) на структуру.
  • Следствие: Изменения внутри метода напрямую влияют на оригинальный объект.
  • Пример использования: Когда метод должен модифицировать состояние объекта.

Правила и рекомендации по выбору типа приёмника

  • Согласованность: Если часть методов типа использует pointer receiver, обычно все методы этого типа должны использовать pointer receiver для единообразия.
  • Размер данных: Для больших структур предпочтительнее pointer receiver, чтобы избежать накладных расходов на копирование.
  • Модификация состояния: Методы, изменяющие состояние, должны использовать pointer receiver.
  • Идиоматика Go: Несмотря на название "параметр-приёмник", в Go принято говорить просто "receiver". В русскоязычной литературе и сообществе часто используются термины "приёмник" или "ресивер".

Пример сравнения двух типов приёмников

package main

import "fmt"

type Counter struct {
    value int
}

// Приёмник по значению
func (c Counter) IncrementByValue() {
    c.value++ // Работает с копией
}

// Приёмник по ссылке
func (c *Counter) IncrementByPointer() {
    c.value++ // Работает с оригиналом
}

func main() {
    counter := Counter{value: 5}
    
    counter.IncrementByValue()
    fmt.Println(counter.value) // Вывод: 5 (не изменилось)
    
    counter.IncrementByPointer()
    fmt.Println(counter.value) // Вывод: 6 (изменилось)
}

Особенности вызова методов

Go предоставляет удобный синтаксис вызова методов, "маскирующий" разницу между value и pointer receivers:

var user User

// Оба вызова синтаксически идентичны, хотя приёмники разные
user.GetInfo()          // Вызов метода с value receiver
(&user).UpdateName()    // Вызов метода с pointer receiver

// Go автоматически преобразует value в pointer для методов с pointer receiver:
user.UpdateName()       // Это допустимо! Go автоматически сделает (&user)

Это одна из особенностей Go, которая упрощает работу с методами.

Ключевые выводы

  • Параметр перед названием метода называется параметром-приёмником (receiver).
  • Он определяет связь метода с конкретным типом.
  • Существует два вида: приёмник по значению и приёмник по ссылке.
  • Выбор типа влияет на возможность модификации исходного объекта и на производительность.
  • Go предоставляет синтаксический сахар для вызова методов с pointer receiver без явного взятия адреса.

Параметр-приёмник — фундаментальная концепция в Go, которая реализует принципы объектно-ориентированного программирования в стиле Go (через методы и интерфейсы), сохраняя при этом простоту и эффективность языка.

Как называется параметр, указываемый перед названием метода? | PrepBro