Value receiver

Value receiver (получатель-значение) в Go - это способ определения метода, при котором метод получает копию структуры, а не ссылку на нее. В первом параметре метода указывается переменная структуры без символа *. Такой подход гарантирует, что метод не изменит оригинальную структуру, а будет работать с ее копией.

Синтаксис

gofunc (s StructType) MethodName() ReturnType {
  // тело метода
}

Где s - это переменная-получатель типа StructType, а MethodName - имя метода.

Пример

Давайте создадим структуру Person с методом, который использует value receiver для вывода информации:

gopackage main

import "fmt"

type Person struct {
  Name string
  Age  int
}

// Value receiver - метод получает копию структуры
func (p Person) PrintInfo() {
  fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}

func main() {
  person := Person{Name: "John", Age: 30}
  person.PrintInfo()
}

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

go"Name: John, Age: 30"

Пример

Продемонстрируем, что value receiver не изменяет оригинальную структуру:

gopackage main

import "fmt"

type Counter struct {
  Value int
}

// Value receiver - изменение копии не влияет на оригинал
func (c Counter) Increment() {
  c.Value++
  fmt.Println("Inside method:", c.Value)
}

func main() {
  counter := Counter{Value: 5}
  fmt.Println("Before:", counter.Value)
  counter.Increment()
  fmt.Println("After:", counter.Value)
}

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

go"Before: 5"
"Inside method: 6"
"After: 5"

Как видно из примера, изменение Value внутри метода не повлияло на оригинальную структуру.

Пример

Сравним поведение value receiver и pointer receiver:

gopackage main

import "fmt"

type Number struct {
  Val int
}

// Value receiver
func (n Number) AddValue(v int) {
  n.Val += v
}

// Pointer receiver
func (n *Number) AddPointer(v int) {
  n.Val += v
}

func main() {
  num := Number{Val: 10}
  
  num.AddValue(5)
  fmt.Println("After value receiver:", num.Val)
  
  num.AddPointer(5)
  fmt.Println("After pointer receiver:", num.Val)
}

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

go"After value receiver: 10"
"After pointer receiver: 15"

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

  • методы структур methods,
    которые позволяют добавлять поведение структурам
  • получатель-указатель pointer receiver,
    который позволяет изменять оригинальную структуру
  • сами структуры struct,
    которые объединяют связанные данные в один тип
  • доступ к полям структуры field access,
    который позволяет читать и изменять поля структуры