Value receiver
Value receiver (получатель-значение) в Go - это способ определения метода,
при котором метод получает копию структуры, а не ссылку на нее.
В первом параметре метода указывается переменная структуры без символа *.
Такой подход гарантирует, что метод не изменит оригинальную структуру,
а будет работать с ее копией.
Синтаксис
func (s StructType) MethodName() ReturnType {
// тело метода
}
Где s - это переменная-получатель типа StructType,
а MethodName - имя метода.
Пример
Давайте создадим структуру Person с методом,
который использует value receiver для вывода информации:
package 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()
}
Результат выполнения кода:
"Name: John, Age: 30"
Пример
Продемонстрируем, что value receiver не изменяет оригинальную структуру:
package 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)
}
Результат выполнения кода:
"Before: 5"
"Inside method: 6"
"After: 5"
Как видно из примера, изменение Value внутри метода
не повлияло на оригинальную структуру.
Пример
Сравним поведение value receiver и pointer receiver:
package 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)
}
Результат выполнения кода:
"After value receiver: 10"
"After pointer receiver: 15"
Смотрите также
-
методы структур
methods,
которые позволяют добавлять поведение структурам -
получатель-указатель
pointer receiver,
который позволяет изменять оригинальную структуру -
сами структуры
struct,
которые объединяют связанные данные в один тип -
доступ к полям структуры
field access,
который позволяет читать и изменять поля структуры