Go에서 구조체 역참조: 복사 및 참조 비교
Go에서 * 연산자를 사용하여 구조체를 역참조하면 새 구조체를 반환하는 것처럼 보일 수 있습니다. 원래 주소 대신 구조체의 복사본. 이로 인해 오해가 발생할 수 있습니다.
다음 코드를 고려하세요.
type me struct { color string total int }
이 코드에서는 me라는 구조체를 정의합니다.
학습 함수 내에서 다음을 생성합니다. me 구조체 p를 만들고 색상 필드를 초기화합니다. 그런 다음 &p를 사용하여 p의 주소를 반환합니다.
func study() *me { p := me{} p.color = "tomato" return &p }
main 함수에서 p.color의 주소를 가져와 &p.color에 저장합니다. 그런 다음 p를 역참조하고 결과를 obj에 저장합니다.
func main() { p := study() obj := *p }
이제 출력을 살펴보겠습니다.
&p.color = 0x10434120 &obj.color = 0x10434140 //different than &p.color!
&p.color와 &obj.color를 비교하면 다음을 알 수 있습니다. 그들은 다른 주소를 가지고 있습니다. 이는 p를 역참조할 때 구조체의 새 복사본을 생성한다는 의미일 수 있습니다.
그러나 그렇지 않습니다. *p를 사용하면 p가 가리키는 구조체의 값을 복사합니다. 다음을 사용하는 것과 같습니다.
var obj me = *p
obj는 me 유형의 새 변수이며 *p 값으로 초기화됩니다. 이로 인해 obj는 별도의 메모리 주소를 갖게 됩니다.
obj는 me 유형이고 p는 *me 유형이라는 점에 유의하는 것이 중요합니다. 그것들은 별개의 가치입니다. obj 필드를 변경해도 p 내의 필드에는 영향을 미치지 않습니다.
원래 구조체를 수정하려면 다음을 사용할 수 있습니다.
obj := p // equivalent to: var obj *me = p
이 경우 obj는 동일한 객체를 가리킵니다. p와 같이. 주소는 다르지만 실제 me 개체 내에서는 동일한 주소를 보유합니다.
위 내용은 Go 구조체: 역참조가 복사본을 생성하나요, 아니면 참조를 생성하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!