>백엔드 개발 >Golang >값 수신자 메서드에서 Go 구조체 필드를 수정해도 원래 값이 변경되지 않는 이유는 무엇입니까?

값 수신자 메서드에서 Go 구조체 필드를 수정해도 원래 값이 변경되지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-15 17:16:18124검색

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

구조체 필드에 새 값 할당

Go에서는 구조를 다룰 때 값 수신자와 값 수신자의 개념을 이해하는 것이 중요합니다. 포인터 수신기. 값 수신기는 원래 값의 복사본에서 작동하는 반면 포인터 수신기는 원래 값에서 직접 작동합니다.

예기치 않게 변경되지 않은 구조체 필드 값에 대한 질문이 제기되는 다음 코드 조각을 고려하세요.

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() 메서드는 Print() 메서드에 반영되어야 하는 Point 구조체의 x 필드를 수정한다는 것입니다. 그러나 출력에는 x 필드가 변경되지 않은 것으로 표시됩니다.

해결책: 포인터 수신기 사용

문제는 Move( ) 및 Print() 메서드를 사용합니다. Go에서는 모든 것이 값으로 전달됩니다. 즉, 구조체를 함수에 전달할 때 원래 값의 복사본이 생성됩니다. 따라서 함수 내에서 복사본을 수정해도 원래 값에는 영향을 미치지 않습니다.

이 문제를 해결하려면 포인터 수신기를 사용해야 합니다. 포인터 수신기를 사용하면 함수가 원래 값에서 직접 작동할 수 있습니다. 수정된 코드는 다음과 같습니다.

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() 및 Print() 메서드에 대한 포인터 수신기를 사용하여 이제 원래 Point 구조체에서 직접 작업하고 x 필드에 대한 변경 사항이 올바르게 반영됩니다. .

위 내용은 값 수신자 메서드에서 Go 구조체 필드를 수정해도 원래 값이 변경되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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