구조체 필드에 새 값 할당
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!