Gibt es eine Möglichkeit, (generische) Typparameter einzuschränken?
PHP-Editor Youzi hat eine häufig gestellte Frage besprochen: Gibt es eine Möglichkeit, (universelle) Typparameter einzuschränken? In PHP müssen wir den Parametern von Funktionen oder Methoden häufig Typbeschränkungen auferlegen, um sicherzustellen, dass die übergebenen Parameter bestimmte Typanforderungen erfüllen. Derzeit gibt es jedoch keine direkte Möglichkeit, generische Typparameter wie Arrays oder Objekte einzuschränken. Wir können jedoch Einschränkungen für allgemeine Typparameter implementieren, indem wir eine strengere Typprüfungslogik schreiben, um die Richtigkeit und Konsistenz der Parameter sicherzustellen. In diesem Artikel untersuchen wir verschiedene Möglichkeiten zur Implementierung generischer Typparametereinschränkungen sowie deren Vor- und Nachteile.
Frageninhalt
Ich habe gerade angefangen, Generika zu lernen. Ich versuche also, einen Treiber für eine benutzerdefinierte Datenbank zu verallgemeinern, die auf einigen Protobuf-Nachrichten ausgeführt wird.
Ich würde gerne einen Weg finden, meinen generischen Typ weiter einzuschränken, aber als Zeiger, d. h. sicherstellen (dem Compiler mitteilen), dass die Einschränkung e eine andere Methode implementiert.
Zuerst habe ich die Entitäten eingeschränkt, die die Datenbank verarbeiten kann.
type entity interface { pb.msga | pb.msgb | pb.msgc }
Dann wurde eine gemeinsame Schnittstelle geschrieben, die die Funktionalität der Datenbank beschreibt, damit sie von verschiedenen Diensten verwendet werden kann, die ihre eigenen Rohnachrichten verarbeiten:
type db[e entity] interface { get(...) (e, error) list(...) ([]e, error) ... }
So weit so gut. Allerdings möchte ich diese Entitäten bei der Kommunikation mit der Datenbank auch (de)serialisieren, damit sie über das Netzwerk gesendet, geklont und zusammengeführt werden können. Dinge wie diese:
func encode[e entity](v *e) ([]byte, error) { return proto.marshal(v) }
Der obige Code gibt jedoch den folgenden Fehler aus:
cannot use val (variable of type *e) as type protoreflect.protomessage in argument to proto.marshal: *e does not implement protoreflect.protomessage (type *e is pointer to type parameter, not type parameter)
Das Problem ist die proto.marshal
需要实体(*e)来实现 proto.message
接口,即 protoreflect()
-Methode, die alle meine Entitätstypen implementieren, aber sie ist nicht eingeschränkt und kann vom Compiler nicht abgeleitet werden.
Ich habe auch versucht, die Entität wie folgt zu definieren:
type Entity interface { *pb.MsgA | *pb.MsgB | *pb.MsgC proto.Message }
Aber das fühlt sich nicht richtig an, abgesehen von der Tatsache, dass ich einige zusätzliche Schutzoperationen durchführen muss, um die proto.messages zu instanziieren, auf die der Entitätszeiger verweist.
Lösung
Sie können dies tun:
func encode[m interface { *e; proto.message }, e entity](v m) ([]byte, error) { return proto.marshal(v) }
Wenn Sie eine prägnantere Syntax als oben wünschen, können Sie die Nachrichtenbeschränkung aufheben:
type Message[E Entity] interface { *E proto.Message } func Encode[M Message[E], E Entity](v M) ([]byte, error) { return proto.Marshal(v) }
https://www.php.cn/link/20ba66f905957b34253d9d7abde919f3
Das obige ist der detaillierte Inhalt vonGibt es eine Möglichkeit, (generische) Typparameter einzuschränken?. 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 dem Artikel werden mit Tabellensteuerungstests in GO eine Methode mit einer Tabelle mit Testfällen getestet, um Funktionen mit mehreren Eingaben und Ergebnissen zu testen. Es zeigt Vorteile wie eine verbesserte Lesbarkeit, verringerte Vervielfältigung, Skalierbarkeit, Konsistenz und a
