>  기사  >  백엔드 개발  >  Go의 인터페이스 내부에서 값의 주소를 가져올 수 있나요?

Go의 인터페이스 내부에서 값의 주소를 가져올 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-10-31 02:53:31976검색

 Can You Take the Address of a Value Inside an Interface in Go?

인터페이스 내에서 값 주소 가져오기

Go 프로그래밍 언어의 맥락에서 인터페이스는 집합을 정의하는 계약 역할을 합니다. 유형이 구현해야 하는 메소드. 값이 인터페이스에 할당되면 인터페이스 값으로 래핑됩니다. 그러나 인터페이스 값 자체는 실제 값을 저장하지 않고 그에 대한 참조를 보유합니다.

따라서 & 연산자를 사용하여 인터페이스 내부의 값 주소를 가져오려고 하면 설명된 것처럼 오류가 발생합니다. 다음 코드 조각에서:

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

type retry struct{}

var el = list.Element{Value: retry{}}

p := &el.Value.(retry) // Compilation error: cannot take the address of el.Value.(retry)</code>

이 오류는 인터페이스 내부의 값이 인터페이스 값 자체의 소유이고 새 값이 인터페이스에 할당될 때 해당 저장소가 재사용될 수 있다는 사실에서 발생합니다. . 획득한 주소의 값을 수정하면 인터페이스 값에 직접적인 영향을 미치게 되어 바람직하지 않으며 예상치 못한 동작이 발생할 수 있습니다.

이 상황을 해결하기 위해 사용할 수 있는 대체 접근 방식이 있습니다.

값 대신 포인터 저장:
인터페이스에 구조체 값을 직접 저장하는 대신 해당 구조체에 대한 포인터를 저장할 수 있습니다. 이렇게 하면 인터페이스 값이 변경되더라도 포인터가 유효한 상태로 유지됩니다.

요소 참조 사용:
또 다른 옵션은 *list.Element 값을 포함된 구조에 대한 참조로 전달하는 것입니다. 이는 Go의 유형 안전성을 위반하지 않고 구조체 값에 대한 간접적인 액세스를 효과적으로 제공합니다.

위 내용은 Go의 인터페이스 내부에서 값의 주소를 가져올 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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