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