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 они просты как дважды два!