구조체 또는 포인터를 포인터로 구조체에 포함: 주요 차이점
구조체 유형 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!