> 백엔드 개발 > Golang > X는 Y를 구현하지 않습니다(...메소드에 포인터 수신기가 있음)

X는 Y를 구현하지 않습니다(...메소드에 포인터 수신기가 있음)

WBOY
풀어 주다: 2024-02-12 23:27:08
앞으로
939명이 탐색했습니다.

X 没有实现 Y(...方法有一个指针接收器)

php 편집자 Xiaoxin은 이 기사에서 X가 Y를 구현하지 못하는 문제에 대해 논의할 것입니다. 이 문제에서는 포인터 수신기 접근 방식을 사용했습니다. 이 방법을 통해 우리는 X가 Y를 달성할 수 없는 이유를 더 잘 이해하고 이 문제를 해결하는 방법을 찾을 수 있습니다. 다음 내용에서는 이 문제에 대해 자세히 논의하고 몇 가지 해결책을 제시하겠습니다.

질문 내용

"X는 Y를 구현하지 않습니다(...메소드에 포인터 수신기가 있음)"라는 질문에 대한 몇 가지 Q&A가 이미 있지만, 제가 보기엔 그들은 다른 것에 대해 이야기하고 적용되지 않는 것 같습니다. 내 구체적인 상황에.

그래서 질문을 매우 구체적으로 작성하는 대신 광범위하고 추상적으로 질문하겠습니다. 이 오류가 발생할 수 있는 몇 가지 상황이 있는 것 같습니다. 누군가 요약해 줄 수 있나요?

이 문제를 피하는 방법과 문제가 발생하는 경우 가능성은 무엇입니까? 감사해요.

해결 방법

이 컴파일 시간 오류는 concrete 유형을 인터페이스 유형에 할당하거나 전달(또는 캐스팅)하려고 할 때 발생하며 유형 자체는 인터페이스를 구현하지 않고 포인터 유형에 대한 포인터만 구현합니다. .

간단한 요약: 변수에 대한 할당 인터페이스 유형은 할당된 값이 할당된 인터페이스를 구현하는 경우 유효합니다. method set이 인터페이스의 상위 집합인 경우 이를 구현합니다. 포인터 유형의 메소드 세트에는 포인터 및 비포인터 수신자가 있는 메소드가 포함됩니다. 포인터가 아닌 유형에 대해 설정된 메서드에는 포인터가 아닌 수신기가 있는 메서드가 포함됩니다.

예를 살펴보겠습니다:

으아아아

stringer 인터페이스 유형에는 string()이라는 한 가지 메서드만 있습니다. 인터페이스 값 stringer에 저장된 모든 값에는 이 메서드가 있어야 합니다. 또한 mytype을 생성하고 stringer 接口类型只有一个方法:string()。存储在接口值 stringer 中的任何值都必须具有此方法。我们还创建了一个 mytype,并创建了一个带有指针接收器的方法 mytype.string()。这意味着 string() 方法位于 *mytype 类型的 方法集 中,但是不在 mytypepointer

receiver를 사용하여 mytype.string() 메서드를 생성했습니다. 이는 string() 메서드가 *mytype 유형의

method setmytype 的值分配给 stringer에 있지만 mytype에는 없음을 의미합니다.

*mytype 类型的值分配给 stringer 유형의 변수를 변환하려고 하면 다음 오류가 발생합니다.

으아아아

하지만 을 추가하려고 하면 모든 것이 잘 작동합니다. 으아아아

예상한 결과를 얻었습니다(

go 놀이터에서 시도해 보세요): 으아아아

    따라서 이 컴파일 시간 오류가 발생하기 위한 요구 사항은 다음과 같습니다.
  • 할당된(또는 전달되거나 변환된) 구체적인 유형의
  • 비포인터
  • 할당(또는 전달 또는 변환)되는 인터페이스 유형
  • 구체적인 유형에는 인터페이스에 필요한 메서드가 있지만
포인터 수신기

가 있습니다.

    문제 해결 가능성:
  • 값에 대한 포인터를 사용해야 하며 해당 메서드 세트에는 포인터 수신기가 있는 메서드가 포함됩니다
  • 또는 수신자 유형을
비포인터

로 변경해야 하므로 비포인터 구체적인 유형의 메소드 세트에도 메소드가 포함됩니다(따라서 인터페이스를 만족함). 메소드가 값을 수정해야 하는 것처럼 이는 가능할 수도 있고 불가능할 수도 있습니다. 포인터가 아닌 수신자는 옵션이 아닙니다.

구조 및 임베딩 struct

구조체 및 임베딩

을 사용하는 경우 일반적으로 인터페이스를 구현하는 "사용자"(메소드 구현 제공)가 아니라 mytype2的方法集不包含内嵌mytypestring()方法,只有*mytype2에 포함된 유형입니다. 이 예처럼: 으아아아

메소드 설정으로 인해 다시 컴파일할 때 오류가 발생하여 다음 메소드가 작동합니다(

Go to the Playground *mytype 并仅使用非指针 mytype2에서): 으아아아 *mytype을 삽입하고

비포인터

mytype2를 사용하면 작동하게 만들 수도 있습니다(mytype*mytype),如果我们使用指针 *mytype2Playground로 이동에서). 으아아아

또한 우리가 무엇을 삽입하든 관계없이(

항상 작동합니다(Go to the Playground에서):

으아아아 🎜사양의 관련 섹션(🎜구조 유형🎜 섹션): 🎜

给定一个结构体类型 s 和一个名为 t 的类型,提升的方法包含在该结构体的方法集中,如下所示:

  • 如果 s 包含匿名字段 t,则 s*s 的方法集均包含接收者为 t 的提升方法。 *s 的方法集还包括接收者 *t 的提升方法。
  • 如果 s 包含匿名字段 *t,则 s*s 的方法集都包含接收者为 t*t 的提升方法。

换句话说:如果我们嵌入一个非指针类型,非指针嵌入器的方法集只能获取具有非指针接收器的方法(来自嵌入类型)。

如果我们嵌入一个指针类型,非指针嵌入器的方法集将获取具有指针和非指针接收器的方法(来自嵌入类型)。

如果我们使用指向嵌入器的指针值,则无论嵌入类型是否是指针,指向嵌入器的指针的方法集始终都会获取具有指针和非指针接收器的方法(从嵌入类型)。

注意:

有一个非常相似的情况,即当您有一个包含 mytype 值的接口值时,并且您尝试 类型断言 另一个接口值,stringer。在这种情况下,由于上述原因,断言将不成立,但我们会得到一个略有不同的运行时错误:

m := mytype{value: "something"}

var i interface{} = m
fmt.println(i.(stringer))
로그인 후 복사

运行时恐慌(在 go playground 上尝试一下):

panic: interface conversion: main.mytype is not main.stringer:
    missing method string
로그인 후 복사

尝试转换而不是类型断言,我们得到了我们正在讨论的编译时错误:

m := MyType{value: "something"}

fmt.Println(Stringer(m))
로그인 후 복사

위 내용은 X는 Y를 구현하지 않습니다(...메소드에 포인터 수신기가 있음)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿