> 백엔드 개발 > Golang > Go에 내장된 구조체: 값으로 삽입할 때와 포인터로 삽입해야 하는 경우는 언제인가요?

Go에 내장된 구조체: 값으로 삽입할 때와 포인터로 삽입해야 하는 경우는 언제인가요?

Mary-Kate Olsen
풀어 주다: 2024-11-02 19:34:30
원래의
1122명이 탐색했습니다.

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Go의 내장 구조체: 포인터 대 객체

포인터 수신기를 다루고 포인터 유형을 구성할 때 구조체 내장 간의 차이점을 이해하세요. 객체(B) 대 포인터(*B)가 중요해지기 때문입니다. 이러한 맥락에서 이러한 두 내장 구조체 유형의 0 값은 크게 다릅니다.

직접 삽입(객체)

포인터 수신기가 있는 구조체 B가 다음과 같이 직접 내장된 경우 구조체 A 내의 객체, 해당 객체의 0 값에는 자체적으로 0 값을 갖는 유형 B의 내장 객체가 포함됩니다. 개발자는 이 포함된 개체와 해당 메서드에 안전하게 액세스할 수 있습니다.

<code class="go">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</code>
로그인 후 복사

포인터 포함

반대로 B(*B)에 대한 포인터를 포함하면 다른 시나리오가 생성됩니다. . 이 내장된 구조체의 0 값에는 nil 포인터 값이 있어 직접 사용할 수 없게 됩니다.

<code class="go">type APtr struct {
    *B
}

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

객체 복사

AObj 객체가 생성되면 다음을 얻습니다. 포함된 B 개체의 복사본입니다. 복사본에 대한 수정은 원본 개체에 영향을 미치지 않습니다.

<code class="go">aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0</code>
로그인 후 복사

포인터 복사

APtr을 사용하면 새 개체를 생성하면 포인터(*B)가 복사되지만 가리키는 기본 구체적인 객체가 아닙니다. 따라서 새 개체에 대한 수정 사항은 원래 개체와 새 개체 모두에 영향을 미칩니다.

<code class="go">aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1</code>
로그인 후 복사

구조체를 개체로 포함할지 아니면 포인터로 포함할지 결정할 때 특정 사용 사례와 요구 사항을 고려하는 것이 중요합니다. 이 결정은 무엇보다도 제로 초기화, 복사 동작, 객체 소유권에 영향을 미칠 수 있습니다.

위 내용은 Go에 내장된 구조체: 값으로 삽입할 때와 포인터로 삽입해야 하는 경우는 언제인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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