구조체 유형을 포인터로 사용하는 경우(예: 포인터 수신기를 사용하는 경우 생성자는 A 등), 구조체(B) 또는 해당 포인터(B)를 포함하는 것 사이의 선택은 미묘하지만 중요합니다. 결과.
0 값
두 옵션의 0 값은 크게 다릅니다. 임베딩 B는 값이 0인 임베딩 객체를 직접 생성하므로 이에 대한 즉각적인 작업이 가능합니다.
type AObj struct { B }
var aObj AObj
aObj.Print() // Prints 0 (B's zero value)
반대로 *B를 삽입하면 nil 포인터로 0 값이 생성되므로 직접 사용할 수 없습니다.
type APtr struct { *B }
var aPtr APtr
aPtr.Print() // Panics (nil pointer dereference)
복사
객체 복사 동작은 포함 유형에 따라 다릅니다. B가 객체로 포함된 경우 복사 시 새 객체가 생성됩니다.
type AObj struct { B }
aObj2 := aObj
aObj.X = 1
aObj2.Print() // Prints 0 (copy of B's zero value)
반대로, 포인터 삽입(*B)을 사용하면 원본 객체와 복사된 객체 모두 동일한 기본 B 객체를 공유하므로 동기화된 변경이 가능합니다.
type APtr struct { *B }
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // Prints 1 (shared underlying B)
이러한 차이점은 코드 가독성, 유지 관리성 및 성능 최적화에 실질적인 영향을 미칩니다. 구조체 임베딩과 포인터 임베딩의 미묘한 차이를 이해함으로써 개발자는 잠재적인 함정을 사전에 방지하고 특정 사용 사례에 가장 적합한 접근 방식을 활용할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3