>백엔드 개발 >Golang >내 Go 구조체 메서드가 원본 개체를 수정하지 않는 이유는 무엇입니까?

내 Go 구조체 메서드가 원본 개체를 수정하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-18 15:04:11841검색

Why Does My Go Struct Method Not Modify the Original Object?

구조체 필드에 새 값 할당

다음 시나리오를 고려하십시오. Point 클래스는 x를 조정하는 Move() 메서드로 정의됩니다. 좌표 및 Print() 메서드를 사용하여 결과를 표시합니다. 그러나 코드는 Move()를 호출한 후 조정된 x 값 대신 초기 x 값을 표시하는 예상치 못한 동작을 나타냅니다.

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

이 문제는 Move()가 값 수신자로 정의된다는 사실에서 비롯됩니다. 이는 원래 Point 객체의 복사본에서 작동한다는 것을 의미합니다. 따라서 Move() 내에서 s를 수정해도 실제 인스턴스에는 영향이 없습니다.

이 문제를 해결하려면 Move() 메서드를 포인터 수신자로 정의하여 원본 개체와 직접 상호 작용할 수 있도록 해야 합니다.

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

이제 Move()가 호출되면 s 변수는 원래 Point 객체를 가리키므로 s.x에 대한 변경 사항은 인스턴스에 직접 영향을 줍니다. 결과적으로 Move() 이후 Print()를 호출하면 업데이트된 x 좌표가 올바르게 표시됩니다.

위 내용은 내 Go 구조체 메서드가 원본 개체를 수정하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.