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
类型的 方法集 中,但是不在 mytype
pointer
mytype.string()
메서드를 생성했습니다. 이는 string()
메서드가 *mytype
유형의 method setmytype
的值分配给 stringer
에 있지만 mytype
에는 없음을 의미합니다.
*mytype
类型的值分配给 stringer
유형의 변수를 변환하려고 하면 다음 오류가 발생합니다.
하지만 을 추가하려고 하면 모든 것이 잘 작동합니다. 으아아아
예상한 결과를 얻었습니다(go 놀이터에서 시도해 보세요): 으아아아
가 있습니다.
구조 및 임베딩
struct
을 사용하는 경우 일반적으로 인터페이스를 구현하는 "사용자"(메소드 구현 제공)가 아니라 mytype2
的方法集不包含内嵌mytype
的string()
方法,只有*mytype2
에 포함된 유형입니다. 이 예처럼:
으아아아
Go to the Playground *mytype
并仅使用非指针 mytype2
에서):
으아아아
*mytype
을 삽입하고
mytype2
를 사용하면 작동하게 만들 수도 있습니다(mytype
或 *mytype
),如果我们使用指针 *mytype2
Playground로 이동에서).
으아아아
항상 작동합니다(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!