>백엔드 개발 >Golang >Golang 인터페이스의 주소 지정이 불가능한 값에 주소로 액세스할 수 없는 이유는 무엇입니까?

Golang 인터페이스의 주소 지정이 불가능한 값에 주소로 액세스할 수 없는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-28 06:25:17454검색

Why Are Non-Addressable Values in Golang Interfaces Not Accessable by Address?

Golang 인터페이스의 주소 지정이 불가능한 값

Golang 문서 및 커뮤니티 포럼에서 널리 논의되는 Go 인터페이스의 주소 지정이 불가능한 값 개념은 다음과 같은 질문을 촉발합니다. 왜 이러한 값은 해당 값을 통해 액세스할 수 없습니까? 주소?

배경

MethodSets의 Go 위키(https://github.com/golang/go/wiki/MethodSets#interfaces)에서 지적했듯이 "구체적인 값은 인터페이스는 맵 요소에 주소를 지정할 수 없는 것과 마찬가지로 주소를 지정할 수 없습니다." 맵 요소의 주소 지정 불가능성은 잘 이해되어 있으며 동반 게시물 "왜 맵 값은 주소 지정이 불가능합니까?"에서 자세히 설명되어 있습니다.

인터페이스 값의 주소 지정 불가능 이유

단, , 인터페이스의 값을 주소 지정할 수 없는 근본적인 이유는 명확하지 않습니다. 언어 설계에서 이러한 제한을 적용하는 이유는 무엇입니까?

답은 유형 무결성을 유지하는 데 있습니다. 인터페이스에 할당된 특정 유형의 값에 대한 포인터는 해당 유형의 값을 가리켜야 합니다. 그러나 인터페이스가 다른 유형의 값을 포함할 수 있는 경우 다른 유형의 값이 인터페이스에 할당될 때마다 포인터가 유효하지 않게 됩니다.

설명하기 위해 인터페이스 I와 두 가지 유형 A 및 B를 생각해 보세요. I:

type I interface{}
type A int
type B string

I에 A 값을 저장하고 해당 값의 주소를 가져오면 결과 포인터는 *A 유형이 됩니다. 그러나 나중에 B 값을 I에 할당하면 포인터가 유효하지 않게 됩니다.

포인터 수신기가 있는 메서드에 대한 의미

인터페이스 값의 주소 지정 불가능성은 포인터가 있는 메서드에 직접적인 영향을 미칩니다. 수신기. 이러한 메서드에는 특정 구체적인 유형에 대한 포인터가 필요합니다. 인터페이스의 포인터가 아닌 값은 주소를 지정할 수 없으므로 포인터 수신기가 있는 메서드에 전달할 수 없으며 오류가 발생합니다.

<type> does not implement <interface> (<name> method has pointer receiver)

결론

요약하면 Go 인터페이스에서 값을 주소 지정할 수 없는 이유는 유형 무결성을 보호하기 위한 것입니다. 특정 유형의 값에 대한 포인터는 항상 해당 유형의 값을 가리켜야 하며, 값이 다른 유형의 값을 보유할 수 있는 인터페이스에 저장되어 있는 경우에는 보장할 수 없습니다.

위 내용은 Golang 인터페이스의 주소 지정이 불가능한 값에 주소로 액세스할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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