구조체 필드에 새 값 할당
다음 시나리오를 고려하십시오. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!