>  기사  >  백엔드 개발  >  구조체 또는 구조체에 대한 포인터 포함: 언제, 왜?

구조체 또는 구조체에 대한 포인터 포함: 언제, 왜?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 02:51:27633검색

Embed a Struct or a Pointer to a Struct: When and Why?

구조체 또는 포인터를 포인터로 구조체에 포함: 주요 차이점

구조체 유형 A가 포인터 수신기와 생성자만 있는 포인터 역할을 하는 경우 A를 반환하고 다른 구조체 유형 B를 포함하면 B를 직접 포함하거나 B를 포함하는 두 가지 옵션이 제공됩니다.

0 값 차이:

0 값 내장된 B와 내장된 *B가 있는 A는 다릅니다. B가 직접 삽입되면 A의 0 값에 B의 0 값이 삽입되어 초기화 없이 안전하게 사용할 수 있습니다.

<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>

그러나 APtr의 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, due to the copy</code>

반대로, 새 APtr을 생성하면 *B가 복사되고 공유된 구체적인 객체는 유지됩니다.

<code class="go">aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1, due to shared reference</code>

예:

https://play.golang.org/p/XmOgegwVFeE는 이러한 차이점을 보여주는 실행 가능한 예제를 제공합니다.

위 내용은 구조체 또는 구조체에 대한 포인터 포함: 언제, 왜?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.