> 백엔드 개발 > Golang > Go 구조체: 역참조가 복사본을 생성하나요, 아니면 참조를 생성하나요?

Go 구조체: 역참조가 복사본을 생성하나요, 아니면 참조를 생성하나요?

DDD
풀어 주다: 2024-11-30 06:48:15
원래의
556명이 탐색했습니다.

Go Structs: Does Dereferencing Create a Copy or a Reference?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿