>  기사  >  백엔드 개발  >  인터페이스된 값에 대한 포인터를 검색하면 예외가 발생하는 이유는 무엇입니까?

인터페이스된 값에 대한 포인터를 검색하면 예외가 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-28 19:18:02210검색

Why Does Retrieving Pointers to Interfaced Values Raise an Exception?

인터페이스된 값에 대한 포인터 검색

인터페이스 내에 저장된 값에 대한 포인터를 얻으려고 하면 다음과 같이 예외가 발생할 수 있습니다. 아래 코드:

<code class="go">import "container/list"

type retry struct{}

el := list.New().PushBack(retry{})
p := &el.Value.(retry)</code>

이로 인해 el.Value.(retry)의 주소를 가져올 수 없다는 오류가 발생합니다. 이 동작은 구조체에만 국한되지 않습니다. 이는 인터페이스에 저장된 모든 유형에 적용됩니다.

인터페이스 값 표현 이해

이 제한 사항을 이해하려면 인터페이스 값의 내부 표현을 고려하세요. 두 단어로 구성됩니다:

  • 첫 번째 단어에는 포함된 값의 유형 정보가 포함됩니다.
  • 두 번째 단어는 값 자체를 저장하거나(단어 내에 맞는 경우) 저장소에 대한 포인터(값이 단어 크기를 초과하는 경우).

결정적으로 포함된 값은 인터페이스 변수의 소유입니다. 또한 이 값에 대한 저장소는 새 값이 인터페이스에 할당되면 재사용될 수 있습니다.

허용되는 포인터 검색의 결과

이러한 원칙을 이해하고 다음을 고려하세요. 코드:

<code class="go">var v interface{}
v = int(42)
p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42
v = &SomeStruct{...}</code>

여기서 정수에 사용되는 저장소는 구조체에 대한 포인터를 보유하도록 용도가 변경되었습니다. 결과적으로 *p를 역참조하면 이제 SomeStruct에 대한 포인터의 정수 표현이 생성됩니다. 이 동작은 유형 시스템을 약화시킬 가능성이 있습니다.

대체 솔루션

이 문제를 방지하려면 목록에 구조체 자체 대신 구조체에 대한 포인터를 저장하는 것이 좋습니다. 또는 포함된 구조에 대한 참조로 *list.Element 값을 전달할 수도 있습니다.

위 내용은 인터페이스된 값에 대한 포인터를 검색하면 예외가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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