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
类型的 方法集 中,但是不在 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











보안 통신에 널리 사용되는 오픈 소스 라이브러리로서 OpenSSL은 암호화 알고리즘, 키 및 인증서 관리 기능을 제공합니다. 그러나 역사적 버전에는 알려진 보안 취약점이 있으며 그 중 일부는 매우 유해합니다. 이 기사는 데비안 시스템의 OpenSSL에 대한 일반적인 취약점 및 응답 측정에 중점을 둘 것입니다. DebianopensSL 알려진 취약점 : OpenSSL은 다음과 같은 몇 가지 심각한 취약점을 경험했습니다. 심장 출혈 취약성 (CVE-2014-0160) :이 취약점은 OpenSSL 1.0.1 ~ 1.0.1F 및 1.0.2 ~ 1.0.2 베타 버전에 영향을 미칩니다. 공격자는이 취약점을 사용하여 암호화 키 등을 포함하여 서버에서 무단 읽기 민감한 정보를 사용할 수 있습니다.

이 기사는 프로파일 링 활성화, 데이터 수집 및 CPU 및 메모리 문제와 같은 일반적인 병목 현상을 식별하는 등 GO 성능 분석을 위해 PPROF 도구를 사용하는 방법을 설명합니다.

이 기사는 GO에서 단위 테스트 작성, 모범 사례, 조롱 기술 및 효율적인 테스트 관리를위한 도구를 다루는 것에 대해 논의합니다.

Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

백엔드 학습 경로 : 프론트 엔드에서 백엔드 초보자로서 프론트 엔드에서 백엔드까지의 탐사 여행은 프론트 엔드 개발에서 변화하는 백엔드 초보자로서 이미 Nodejs의 기초를 가지고 있습니다.

이 기사에서는 GO.MOD를 통해 GO 모듈 종속성 관리, 사양, 업데이트 및 충돌 해상도를 포함합니다. 시맨틱 버전 작성 및 정기 업데이트와 같은 모범 사례를 강조합니다.

이 기사는 데비안 시스템에서 PostgresQL 데이터베이스를 모니터링하는 다양한 방법과 도구를 소개하여 데이터베이스 성능 모니터링을 완전히 파악할 수 있도록 도와줍니다. 1. PostgreSQL을 사용하여 빌드 인 모니터링보기 PostgreSQL 자체는 데이터베이스 활동 모니터링 활동을위한 여러보기를 제공합니다. PG_STAT_REPLICATION : 특히 스트림 복제 클러스터에 적합한 복제 상태를 모니터링합니다. PG_STAT_DATABASE : 데이터베이스 크기, 트랜잭션 커밋/롤백 시간 및 기타 주요 지표와 같은 데이터베이스 통계를 제공합니다. 2. 로그 분석 도구 PGBADG를 사용하십시오
