Go — язык про простоту и композицию. В этом разделе мы разберём, как добавлять поведение к структурам с помощью методов и организовывать код через интерфейсы.


💪 Что такое метод?

Метод — это функция, которая “принадлежит” типу. Например, мы можем сделать метод для структуры User:

type User struct {
    Name string
}

func (u User) Greet() {
    fmt.Println("Привет,", u.Name)
}

Теперь можно вызвать user.Greet():

user := User{Name: "Иван"}
user.Greet()
// → Привет, Иван

Метод — это просто функция, но с приёмником (u в примере), который указывает, к какому типу он относится.


📅 Значение или указатель?

Есть два способа объяявлять приёмник:

  • значение (например, u User)
  • указатель (например, u *User)

Если нужно изменить поля внутри метода — используй указатель:

func (u *User) Rename(newName string) {
    u.Name = newName
}

Вызов при этом остаётся тем же:

user.Rename("Олег")

Go автоматически производит потребуемые преобразования (user в &user и обратно).


🤠 Что такое интерфейс?

Интерфейс в Go определяет набор методов, которые должен реализовать тип. Но Go делает это просто:

type Greeter interface {
    Greet()
}

Теперь любой тип, который имеет метод Greet(), уже считается Greeter:

func SayHello(g Greeter) {
    g.Greet()
}

И это работает даже без явного implements или extends!


✅ Главное из главы

  • Методы добавляют поведение к типам
  • Указательные приёмники нужны, если хочешь изменить состояние
  • Интерфейсы объявляют поведение, а не структуру
  • В Go неявная реализация: тип “сам” совпадает с интерфейсом

Дальше мы разберёмся с указателями: зачем они нужны, как работают, и почему в Go они просты как дважды два!