>  기사  >  백엔드 개발  >  Go에 임베딩하기: 포인터와 값을 언제 사용해야 할까요?

Go에 임베딩하기: 포인터와 값을 언제 사용해야 할까요?

Susan Sarandon
Susan Sarandon원래의
2024-11-02 08:21:29124검색

Embedding in Go: When to Use a Pointer vs. a Value?

Go에 임베드하기: 포인터를 사용해야 하는 경우

다른 구조체 내에 구조체를 임베드할 때 포인터를 사용할지 아니면 값을 사용할지 결정하는 것이 달라집니다.

값 사용

값으로 구조체를 포함한다는 것은 포함된 구조체의 복사본이 포함 구조체 내에 저장된다는 의미입니다. 이는 다음과 같은 상황에 적합합니다.

  • 포함된 구조체가 작고 자주 액세스됩니다.
  • 런타임에 포함된 구조체를 동적으로 변경할 필요가 없습니다.
<code class="go">type Job struct {
    Command string
    log.Logger
}</code>

포인터 사용

포인터로 구조체를 포함하면 포함 구조체의 여러 인스턴스 간에 메모리 공유가 가능해집니다. 이는 다음과 같은 경우에 유용합니다.

  • 불필요한 중복을 피하기 위해 크거나 복잡한 구조체를 삽입합니다.
  • 런타임에 삽입된 구조체에 대한 동적 변경을 활성화합니다.
<code class="go">type Job struct {
    Command string
    *log.Logger
}</code>

포인터에 의한 삽입의 장점

Eric Urban("hydrogen18")은 "포인터에 의한 삽입"이라는 용어를 만들었습니다. 다음과 같은 이점을 제공합니다.

  • 참조로 구조체를 초기화하는 함수 사용, NewX 관용어 활용.
  • 인스턴스화 시간을 알 필요 없이 유형의 기능 포함.

포인터 삽입을 사용한 플라이웨이트 패턴

비트맵 구조체에 포인터를 삽입하면 여러 렌더러 구조체가 동일한 기본 비트맵 데이터를 공유하여 메모리 소비를 줄이고 런타임을 활성화할 수 있습니다. 유연성.

<code class="go">type Bitmap struct{
    data [4][5]bool
}

type Renderer struct{
    *Bitmap //Embed by pointer
    on uint8
    off uint8
}</code>

포인터에 의한 삽입 제한

익명 필드는 포인터에 대한 포인터나 인터페이스 유형에 대한 포인터를 가질 수 없습니다. 이러한 유형에는 메소드가 없기 때문입니다. . 이 제한은 인터페이스에 대한 포인터의 잘못된 사용을 방지하고 언어의 일관성을 유지하기 위한 것입니다.

위 내용은 Go에 임베딩하기: 포인터와 값을 언제 사용해야 할까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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