Home > Backend Development > Golang > Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

DDD
Release: 2024-12-15 17:16:18
Original
116 people have browsed it

Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

Assigning a New Value to a Struct Field

In Go, when dealing with structures, it's important to understand the concept of value receivers versus pointer receivers. A value receiver operates on a copy of the original value, while a pointer receiver operates directly on the original value.

Consider this code snippet, where the question is raised about unexpectedly unchanged struct field values:

type Point struct {
  x, dx int
}

func (s Point) Move() {
  s.x += s.dx
  log.Printf("New X=%d", s.x)
}

func (s Point) Print() {
  log.Printf("Final X=%d", s.x)
}

func main() {
  st := Point{ 3, 2 };
  st.Move()
  st.Print()
}
Copy after login

The expectation is that the Move() method modifies the x field of the Point struct, which should be reflected in the Print() method. However, the output shows that the x field remains unchanged.

The Solution: Using Pointer Receivers

The issue lies in the use of a value receiver in the Move() and Print() methods. In Go, everything is passed by value, meaning that a copy of the original value is created when passing a struct to a function. Therefore, any modifications made to the copy within the function do not affect the original value.

To solve this, we need to use pointer receivers. A pointer receiver allows the function to operate directly on the original value. Here's the corrected code:

type Point struct {
  x, dx int
}

func (s *Point) Move() {
  s.x += s.dx
  log.Printf("New X=%d", s.x)
}

func (s *Point) Print() {
  log.Printf("Final X=%d", s.x)
}

func main() {
  st := Point{ 3, 2 };
  st.Move()
  st.Print()
}
Copy after login

By using a pointer receiver for the Move() and Print() methods, we now operate directly on the original Point struct, and the changes to the x field are reflected correctly.

The above is the detailed content of Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template