인터페이스된 값에 대한 포인터 검색
인터페이스 내에 저장된 값에 대한 포인터를 얻으려고 하면 다음과 같이 예외가 발생할 수 있습니다. 아래 코드:
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!