Go 역참조: 복사본이냐 아니냐, 그것이 문제로다
역참조 연산자(*)를 사용하여 Go 구조체에 액세스할 때 사용자는 다음과 같은 작업을 수행할 수 있습니다. 결과가 구조체의 새 복사본인지 아니면 원본에 대한 참조인지 궁금합니다. object.
동작 이해
제공된 코드 조각에서:
type me struct { color string total int } func study() *me { p := me{} return &p } obj := *study()
study()는 me 구조체에 대한 포인터를 반환합니다. obj에서 이를 역참조하면 구조체의 복사본이 생성됩니다. 이는 &p.color와 &obj.color의 메모리 주소가 다른 점에서 분명합니다.
역참조된 구조체 obj가 원래 구조체와 동일한 메모리 주소를 가질 것으로 예상할 수 있지만 실제로는 그렇지 않습니다. 이 경우. 이 동작은 범위 끝에서 Go의 변수 자동 할당 해제로 인해 발생할 수 있습니다.
실제로 참조인 경우
참조 동작을 달성하려면 다음을 사용하여 구조체를 직접 가리키는 포인터:
obj := study()
이 경우 obj는 원래 me 구조체에 대한 포인터가 됩니다. p 또는 obj를 변경하면 동일한 기본 구조체에 영향을 미칩니다.
결론
Go에서 구조체를 역참조할 때 결과가 다음의 복사본이라는 점을 이해하는 것이 중요합니다. 구조체에 대한 포인터가 명시적으로 할당되지 않는 한 원래 구조체입니다. 이 동작을 통해 역참조된 구조체에 대한 변경 사항이 원래 구조체에 영향을 주지 않고 캡슐화 및 변수 독립성을 유지합니다.
위 내용은 Go의 역참조 연산자는 원본 구조체에 대한 복사본이나 참조를 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!