Методы структуры
Метод структуры - это функция, которая привязана к определенному типу структуры. В первом параметре указывается получатель (receiver) - переменная структуры, к которой привязывается метод. Методы позволяют организовать поведение объектов и реализовать интерфейсы.
Синтаксис
func (receiver Type) MethodName(params) returnType {
// тело метода
}
Пример
Объявим структуру Person и метод для вывода информации о человеке:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p Person) PrintInfo() {
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}
func main() {
person := Person{Name: "Alice", Age: 30}
person.PrintInfo()
}
Результат выполнения кода:
"Name: Alice, Age: 30"
Пример
Метод может принимать параметры и возвращать значения. Например, метод для расчета возраста через несколько лет:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p Person) AgeInYears(years int) int {
return p.Age + years
}
func main() {
person := Person{Name: "Bob", Age: 25}
res := person.AgeInYears(5)
fmt.Println(res)
}
Результат выполнения кода:
30
Пример
Метод может изменять состояние структуры, если использовать указатель в качестве получателя:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) IncreaseAge() {
p.Age++
}
func main() {
person := Person{Name: "Charlie", Age: 40}
person.IncreaseAge()
fmt.Println(person.Age)
}
Результат выполнения кода:
41
Пример
Методы могут быть объявлены для любого типа, а не только для структур. Например, для пользовательского типа на основе int:
package main
import "fmt"
type MyInt int
func (m MyInt) IsPositive() bool {
return m > 0
}
func main() {
num := MyInt(10)
res := num.IsPositive()
fmt.Println(res)
}
Результат выполнения кода:
true
Пример
Методы структур могут вызывать друг друга. Например, метод для изменения имени вызывает метод для вывода информации:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) SetName(name string) {
p.Name = name
}
func (p Person) PrintInfo() {
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}
func main() {
person := Person{Name: "David", Age: 35}
person.PrintInfo()
person.SetName("Daniel")
person.PrintInfo()
}
Результат выполнения кода:
"Name: David, Age: 35"
"Name: Daniel, Age: 35"
Смотрите также
-
раздел
Структуры в Go,
в котором описывается объявление пользовательских типов -
раздел
Получатель по значению,
в котором рассматривается передача структуры по значению -
раздел
Получатель по указателю,
в котором рассматривается передача структуры по указателю -
раздел
Встраивание структур,
в котором описывается композиция структур