X implementiert Y nicht (...Methode hat einen Zeigerempfänger)
php-Editor Xiaoxin wird in diesem Artikel ein Problem besprechen, bei dem X Y nicht implementiert. Bei diesem Problem haben wir einen Pointer-Receiver-Ansatz verwendet. Durch diese Methode können wir besser verstehen, warum X Y nicht erreichen kann, und Wege finden, dieses Problem zu lösen. Im folgenden Inhalt werden wir dieses Problem im Detail besprechen und einige Lösungen anbieten.
Frageninhalt
Zu der Frage „ auf meine spezifische Situation.
Anstatt die Frage also sehr spezifisch zu formulieren, werde ich sie weit gefasst und abstrakt formulieren – es scheint, als gäbe es ein paar verschiedene Situationen, die zu diesem Fehler führen könnten. Kann das jemand zusammenfassen?Wie kann man dieses Problem vermeiden und welche Möglichkeiten gibt es, wenn es auftritt? Danke. ProblemumgehungDieser Fehler bei der Kompilierung tritt auf, wenn Sie versuchen, einem Schnittstellentyp einen „konkreten“ Typ zuzuweisen oder zu übergeben (oder umzuwandeln), und der Typ selbst implementiert nicht die Schnittstelle, sondern nur einen „Zeiger“ auf den Typzeiger
. Kurze Zusammenfassung:
EineZuweisung an eine VariableDer Schnittstellentyp ist gültig, wenn der zugewiesene Wert die Schnittstelle implementiert, der er zugewiesen ist. Wenn sein Methodensatz eine Obermenge der Schnittstelle ist, wird er diese implementieren. Der Methodensatz der Zeigertypen umfasst Methoden mit Zeiger- und Nicht-Zeiger-Empfängern. Der Methodensatz für Nicht-Zeiger-Typen umfasst nur Methoden mit Nicht-Zeiger-Empfängern.
Sehen wir uns ein Beispiel an:
type stringer interface {
string() string
}
type mytype struct {
value string
}
func (m *mytype) string() string { return m.value }
stringer
-Schnittstellentyp hat nur eine Methode: string()
. Jeder im Schnittstellenwert stringer
gespeicherte Wert muss über diese Methode verfügen. Wir haben auch einen mytype
und eine Methode mytype.string()
mit einem
receiver erstellt. Das bedeutet, dass sich die Methode string()
im
des Typs *mytype
befindet, aber nicht in mytype
. stringer
接口类型只有一个方法:string()
。存储在接口值 stringer
中的任何值都必须具有此方法。我们还创建了一个 mytype
,并创建了一个带有指针接收器的方法 mytype.string()
。这意味着 string()
方法位于 *mytype
类型的 方法集 中,但是不在 mytype
zu konvertieren, erhalten wir die folgende Fehlermeldung: mytype
的值分配给 stringer
m := mytype{value: "something"} var s stringer s = m // cannot use m (type mytype) as type stringer in assignment: // mytype does not implement stringer (string method has pointer receiver)
hinzuzufügen, funktioniert alles gut: *mytype
类型的值分配给 stringer
s = &m fmt.println(s)
Go Playground):
something
Daher die Voraussetzung, um diesen Fehler bei der Kompilierung zu erhalten:
- Ein
- Nicht-Zeiger-Wert eines konkreten Typs, der zugewiesen (oder übergeben oder konvertiert) wird Der Schnittstellentyp, der zugewiesen (oder übergeben oder konvertiert) wird Ein konkreter Typ verfügt über die für die Schnittstelle erforderlichen Methoden, verfügt jedoch über einen
- Zeigerempfänger
- Möglichkeit zur Lösung des Problems:
Es muss ein Zeiger auf einen Wert verwendet werden und sein Methodensatz umfasst Methoden mit Zeigerempfängern
- Oder der Empfängertyp muss in
- Nicht-Zeiger geändert werden, damit der Methodensatz des konkreten Nicht-Zeiger-Typs auch diese Methode enthält (wodurch die Schnittstelle erfüllt wird). Dies kann möglich sein oder auch nicht, denn wenn die Methode den Wert ändern muss, ist ein Nicht-Zeiger-Empfänger keine Option.
- Struktur und Einbettung
Strukturen und dem Einbetten
ist es normalerweise nicht „Sie“, der die Schnittstelle implementiert (die Methodenimplementierungen bereitstellt), sondern der in eingebettete Typ. Wie dieses Beispiel:
type mytype2 struct {
mytype
}
m := mytype{value: "something"}
m2 := mytype2{mytype: m}
var s stringer
s = m2 // compile-time error again
struct
ein Fehler aufgetreten, sodass die folgende Methode funktioniert (in
): mytype2
的方法集不包含内嵌mytype
的string()
方法,只有*mytype2
var s stringer s = &m2
*mytype
einbetten und einfach Nichtzeiger mytype2
verwenden (in Go to Playground*mytype
并仅使用非指针 mytype2
):
type mytype2 struct {
*mytype
}
m := mytype{value: "something"}
m2 := mytype2{mytype: &m}
var s stringer
s = m2
Zum Spielplatz gehenmytype
或 *mytype
),如果我们使用指针 *mytype2
):
type mytype2 struct {
*mytype
}
m := mytype{value: "something"}
m2 := mytype2{mytype: &m}
var s stringer
s = &m2
):
给定一个结构体类型 换句话说:如果我们嵌入一个非指针类型,非指针嵌入器的方法集只能获取具有非指针接收器的方法(来自嵌入类型)。 如果我们嵌入一个指针类型,非指针嵌入器的方法集将获取具有指针和非指针接收器的方法(来自嵌入类型)。 如果我们使用指向嵌入器的指针值,则无论嵌入类型是否是指针,指向嵌入器的指针的方法集始终都会获取具有指针和非指针接收器的方法(从嵌入类型)。 注意: 有一个非常相似的情况,即当您有一个包含 运行时恐慌(在 go 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))
panic: interface conversion: main.mytype is not main.stringer:
missing method string
m := MyType{value: "something"}
fmt.Println(Stringer(m))
Das obige ist der detaillierte Inhalt vonX implementiert Y nicht (...Methode hat einen Zeigerempfänger). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

In dem Artikel werden die Verwaltungs -Go -Modulabhängigkeiten über Go.mod erörtert, die Spezifikationen, Aktualisierungen und Konfliktlösung abdecken. Es betont Best Practices wie semantische Versioning und reguläre Updates.

In diesem Artikel werden eine Vielzahl von Methoden und Tools eingeführt, um PostgreSQL -Datenbanken im Debian -System zu überwachen, um die Datenbankleistung vollständig zu erfassen. 1. verwenden Sie PostgreSQL, um die Überwachungsansicht zu erstellen. PostgreSQL selbst bietet mehrere Ansichten für die Überwachung von Datenbankaktivitäten: PG_STAT_ACTIVITY: Zeigt Datenbankaktivitäten in Echtzeit an, einschließlich Verbindungen, Abfragen, Transaktionen und anderen Informationen. PG_STAT_REPLIKATION: Monitore Replikationsstatus, insbesondere für Stream -Replikationscluster. PG_STAT_DATABASE: Bietet Datenbankstatistiken wie Datenbankgröße, Transaktionsausschüsse/Rollback -Zeiten und andere Schlüsselindikatoren. 2. Verwenden Sie das Log -Analyse -Tool PGBADG
