Go에서 구조체에 대한 포인터와 구조체 자체에 대한 포인터를 언제 삽입해야 합니까?

Mary-Kate Olsen
풀어 주다: 2024-11-03 08:27:30
원래의
783명이 탐색했습니다.

When to Embed a Pointer to a Struct vs. the Struct Itself in Go?

구조체에 대한 포인터 내장과 구조체 자체 내장

주어진 시나리오에서 구조체 유형 A가 포인터이고 포인터 수신기만 포함하므로 구조체 유형 B를 B로 삽입하는 것과 *B로 삽입하는 것 사이에는 차이가 있습니다.

0 값 동작

가장 뚜렷한 차이점은 다음과 같습니다. 결과 구조의 0 값. B를 있는 그대로 포함하는 경우 A 유형의 0 값에는 0 값을 유지하는 B 유형의 포함된 개체도 포함됩니다. 이를 통해 사전 초기화 없이 포함된 필드를 원활하게 사용할 수 있습니다.

type B struct {
    X int
}

func (b *B) Print() { fmt.Printf("%d\n", b.X) }

type AObj struct {
    B
}

var aObj AObj
aObj.Print() // prints 0
로그인 후 복사

반면에 *B를 포함하면 nil 포인터로 0 값이 발생하므로 직접 필드 액세스가 방지됩니다.

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics
로그인 후 복사

필드 복사

A 유형의 새 객체를 생성할 때 필드 복사 동작은 직관에 부합합니다. B를 직접 포함하면 독립성을 유지하면서 새 개체 내에 포함된 개체의 복사본이 생성됩니다.

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0, due to a separate instance of B
로그인 후 복사

반대로, *B를 포함하면 기본 구체적인 개체가 아닌 포인터의 복사본이 생성됩니다. 이는 두 객체가 동일한 B 인스턴스를 공유하여 필드 수정에 영향을 미친다는 것을 의미합니다.

aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1, as both objects point to the same B
로그인 후 복사

본질적으로 B를 삽입하면 포함된 구조체의 개별 인스턴스가 생성되는 반면, *B를 삽입하면 여러 삽입 구조에서 단일 구체적인 인스턴스를 공유합니다. . 이러한 구별은 0 값 의미와 필드 복사 동작 모두에 영향을 미칩니다.

위 내용은 Go에서 구조체에 대한 포인터와 구조체 자체에 대한 포인터를 언제 삽입해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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