Методы структуры

Метод структуры - это функция, которая привязана к определенному типу структуры. В первом параметре указывается получатель (receiver) - переменная структуры, к которой привязывается метод. Методы позволяют организовать поведение объектов и реализовать интерфейсы.

Синтаксис

gofunc (receiver Type) MethodName(params) returnType {
  // тело метода
}

Пример

Объявим структуру Person и метод для вывода информации о человеке:

gopackage 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()
}

Результат выполнения кода:

go"Name: Alice, Age: 30"

Пример

Метод может принимать параметры и возвращать значения. Например, метод для расчета возраста через несколько лет:

gopackage 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)
}

Результат выполнения кода:

go30

Пример

Метод может изменять состояние структуры, если использовать указатель в качестве получателя:

gopackage 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)
}

Результат выполнения кода:

go41

Пример

Методы могут быть объявлены для любого типа, а не только для структур. Например, для пользовательского типа на основе int:

gopackage 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)
}

Результат выполнения кода:

gotrue

Пример

Методы структур могут вызывать друг друга. Например, метод для изменения имени вызывает метод для вывода информации:

gopackage 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()
}

Результат выполнения кода:

go"Name: David, Age: 35"
"Name: Daniel, Age: 35"

Смотрите также