Inhaltsverzeichnis
Frageninhalt
Problemumgehung
Heim Backend-Entwicklung Golang Liste gängiger Strukturen/Schnittstellen in Golang

Liste gängiger Strukturen/Schnittstellen in Golang

Feb 13, 2024 pm 05:30 PM
网络编程

Golang 中的通用结构/接口列表

php-Editor Baicao stellt Ihnen in diesem Artikel die Liste der gängigen Strukturen/Schnittstellen in Golang vor. Golang ist eine Open-Source-Programmiersprache, die leicht zu erlernen, effizient und zuverlässig ist. Sie wird häufig in der Netzwerkprogrammierung, im Cloud Computing und in anderen Bereichen eingesetzt. In Golang sind gemeinsame Strukturen und Schnittstellen sehr wichtige Konzepte, die uns dabei helfen können, die Wiederverwendbarkeit und Skalierbarkeit des Codes zu erreichen. Ich glaube, dass die Leser durch die Einleitung dieses Artikels die allgemeinen Strukturen und Schnittstellen in Golang besser verstehen und anwenden und ihre Programmierkenntnisse verbessern können.

Frageninhalt

Gibt es eine Möglichkeit, eine Liste gängiger Strukturen/Schnittstellen in Go zu erhalten?

Das ist es, was ich erreichen möchte.

<code>package main

type List[T any] struct {
    Elements []T
}

func (f *List[T]) Add(el T) {
    f.Elements = append(f.Elements, el)
}

type ListInterface[T any] interface {
    Add(el T)
}

func main() {
    listOfLists := make([]ListInterface[any], 0)
    listOfLists = append(listOfLists, &List[int]{})
}
</code>
Nach dem Login kopieren

Das ist der Fehler, den ich bekomme.

cannot use &List[int]{} (value of type *List[int]) as ListInterface[any] value in argument to append: *List[int] does not implement ListInterface[any] (wrong type for method Add)
    have Add(int)
    want Add(any)
Nach dem Login kopieren

Wenn ich das richtig verstehe, ist in go any also ein eigener Typ. Es ist kein Synonym für „welchen Typ auch immer die Laufzeit wünscht“. Meine Frage ist, ist es möglich, so etwas zu tun?

Problemumgehung

Was Sie hier zu tun versuchen, lässt darauf schließen, dass Sie davon ausgehen, dass die Generika von go in der Lage sind, Typen zu löschen (genau wie Java-Generika). aber es ist nicht die Wahrheit.

Sie haben eine List[int],这意味着它的 AddMethode wie diese:

func (l *List) Add(el int) {
    l.Elements = append(l.Elements, el)
}
Nach dem Login kopieren

Versuchen Sie dann, es einem Segment von Objekten hinzuzufügen, die diese Schnittstelle implementieren:

Add(v any)
Nach dem Login kopieren

Nun denken Sie vielleicht, dass int als int 可以用作 any verwendet werden kann, und Sie haben Recht, das ist möglich, aber wenn Sie sehen:

var s []ListInterface[any]
Nach dem Login kopieren

Sie sagen, dass alle Elemente in diesem Slice eine Add-Methode haben, die einen Parameter vom Typ Add 方法,该方法采用 any annimmt. Das bedeutet also:

s[0].Add("foo")
s[1].Add(123)
Nach dem Login kopieren

Sollte immer ein gültiger Anruf sein. Wenn s[0] 的类型为 List[int] (如您的代码片段中的情况),则这不成立。您将尝试将字符串附加到 Elements ,其类型为 []int.

Es gibt ein Sprichwort, dass eine Umkehrung erlaubt sein sollte:

s := []ListInterface[int]{}
s = append(s, &List[any]{})
Nach dem Login kopieren

Es scheint ein List[any] 将接受 int Parameter zu sein, aber das ist auch nicht erlaubt. Dies kann in manchen Fällen nützlich sein, in vielen Fällen kann es jedoch problematisch sein.

Im Wesentlichen werden Generika in Go zur Kompilierzeit verarbeitet. Wenn du List[int] 时,编译器将创建一个类似 List_int 的类型,并在该类型上实现 Add(el int) 方法,与您最终使用的任何其他 List 类型相同。这些类型都不会具有 Add(any) 方法,除非您创建 List[any] erschaffst. Betrachten Sie es als eine vom Compiler unterstützte Generierung von Boilerplate-Code. Keine Laufzeitlöschung.

Ergebnis: List[int]List[any] sind völlig unterschiedliche Typen und können daher nicht nebeneinander in einer Scheibe sitzen, als wären sie vom gleichen Typ. Wenn Sie tun und lassen möchten, was Sie wollen, können Sie Folgendes tun:

func (l *List[T]) AddAny(v any) {
    tv, ok := v.(T)
    if !ok {
        return // or return an error
    }
    l.Add(tv)
}
Nach dem Login kopieren

Verwenden Sie den any-Wert-Ansatz und verwenden Sie eine Typzusicherung, um festzustellen, ob ein bestimmter Wert mit dem zugrunde liegenden Typ der Liste kompatibel ist, und fügen Sie ihn hinzu, wenn dies der Fall ist. Sie können sie dann wie folgt zu einem einzigen Stück hinzufügen:

type Lists interface {
    AddAny(any)
}

s := []Lists{}
s = append(s, &List[int]{}, &List[string]{})
s[0].AddAny(123) // will work
s[0].AddAny("foo") // will not, with the current code this will silently fail
s[1].AddAny("foo") // works fine
s[1].AddAny(123) // silently fails
Nach dem Login kopieren

Aber in Wirklichkeit, wenn Sie so etwas tun, schreit der Code nur nach X-Y-Problem, Sie versuchen, Y (Generika) zu verwenden, um Ihr Problem zu lösen, während das eigentliche Problem X ist: Wie lässt sich das Problem am besten lösen?

Das obige ist der detaillierte Inhalt vonListe gängiger Strukturen/Schnittstellen in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die C++-Open-Source-Bibliotheken? Was sind die C++-Open-Source-Bibliotheken? Apr 22, 2024 pm 05:48 PM

C++ bietet einen umfangreichen Satz an Open-Source-Bibliotheken, die die folgenden Funktionen abdecken: Datenstrukturen und Algorithmen (Standard Template Library), Multithreading, reguläre Ausdrücke (Boost), lineare Algebra (Eigen), grafische Benutzeroberfläche (Qt), Computer Vision (OpenCV), maschinelles Lernen (TensorFlow) Verschlüsselung (OpenSSL) Datenkomprimierung (zlib) Netzwerkprogrammierung (libcurl) Datenbankverwaltung (sqlite3)

Wie verarbeiten C++-Funktionen DNS-Abfragen in der Netzwerkprogrammierung? Wie verarbeiten C++-Funktionen DNS-Abfragen in der Netzwerkprogrammierung? Apr 27, 2024 pm 06:39 PM

Die C++-Standardbibliothek stellt Funktionen zur Verarbeitung von DNS-Abfragen in der Netzwerkprogrammierung bereit: gethostbyname(): Hostinformationen basierend auf dem Hostnamen finden. gethostbyaddr(): Hostinformationen basierend auf der IP-Adresse finden. dns_lookup(): Löst DNS asynchron auf.

Wie viele Stufen gibt es in der Python-Prüfung? Wie viele Stufen gibt es in der Python-Prüfung? Apr 02, 2024 pm 06:00 PM

Es gibt 12 Python-Prüfungsstufen, vom Anfänger bis zum Fortgeschrittenen, um die grundlegende Syntax, erweiterte Funktionen, fortgeschrittene Konzepte und zugrunde liegende Mechanismen usw. von Python zu beherrschen, wobei der Schwierigkeitsgrad allmählich zunimmt.

Was sind die gängigen Protokolle für die Java-Netzwerkprogrammierung? Was sind die gängigen Protokolle für die Java-Netzwerkprogrammierung? Apr 15, 2024 am 11:33 AM

Zu den in der Java-Netzwerkprogrammierung häufig verwendeten Protokollen gehören: TCP/IP: Wird für die zuverlässige Datenübertragung und Verbindungsverwaltung verwendet. HTTP: wird für die Web-Datenübertragung verwendet. HTTPS: Eine sichere Version von HTTP, die zur Datenübertragung Verschlüsselung verwendet. UDP: Für schnelle, aber instabile Datenübertragung. JDBC: Wird zur Interaktion mit relationalen Datenbanken verwendet.

Leitfaden zur Auflösung allgemeiner Golang-Funktionsadressen Leitfaden zur Auflösung allgemeiner Golang-Funktionsadressen Apr 08, 2024 pm 02:18 PM

Zu den Schlüsselfunktionen zum Parsen von Adressen in der Go-Sprache gehören: net.ParseIP(): IPv4- oder IPv6-Adressen analysieren. net.ParseCIDR(): CIDR-Tags analysieren. net.ResolveIPAddr(): Hostnamen oder IP-Adresse in IP-Adresse auflösen. net.ResolveTCPAdr(): Hostnamen und Port in TCP-Adresse auflösen. net.ResolveUDPAddr(): Hostnamen und Port in UDP-Adresse auflösen.

Wie lange dauert es, Golang zu lernen? Wie lange dauert es, Golang zu lernen? Apr 02, 2024 pm 07:48 PM

Die Zeit, die benötigt wird, um Golang zu beherrschen, ist von Person zu Person unterschiedlich, dauert jedoch normalerweise einige Monate bis einige Jahre. Zu den Lernphasen gehören: Grundkenntnisse (1–2 Monate), Mittelstufe (3–6 Monate), Fortgeschrittene (6–12 Monate oder länger). Zu den Faktoren, die das Lernen beschleunigen, gehören fortlaufendes Üben, Projektarbeit, Einbindung der Gemeinschaft und Online-Ressourcen. Zu den Einflussfaktoren gehören vorherige Programmiererfahrung, Häufigkeit des Studiums und Lernmaterialien.

Wie implementieren C++-Funktionen Netzwerksicherheit in der Netzwerkprogrammierung? Wie implementieren C++-Funktionen Netzwerksicherheit in der Netzwerkprogrammierung? Apr 28, 2024 am 09:06 AM

C++-Funktionen können Netzwerksicherheit bei der Netzwerkprogrammierung erreichen: 1. Verwendung von Verschlüsselungsalgorithmen (openssl) zur Verschlüsselung der Kommunikation; 2. Verwendung digitaler Signaturen (cryptopp) zur Überprüfung der Datenintegrität und Absenderidentität; ( htmlcxx) zum Filtern und Bereinigen von Benutzereingaben.

Vom Einstieg in die Java-Grundlagen bis zur praktischen Anwendung: Wie gelingt der schnelle Einstieg? Vom Einstieg in die Java-Grundlagen bis zur praktischen Anwendung: Wie gelingt der schnelle Einstieg? May 08, 2024 am 08:30 AM

Java-Einstieg in die Praxis: einschließlich grundlegender Syntaxeinführung (Variablen, Operatoren, Kontrollfluss, Objekte, Klassen, Methoden, Vererbung, Polymorphismus, Kapselung), Kernbibliotheken von Java-Klassen (Ausnahmebehandlung, Sammlungen, Generika, Eingabe-/Ausgabeströme, Netzwerkprogrammierung, Datums- und Zeit-API), praktische Fälle (Taschenrechneranwendung, einschließlich Codebeispiele).

See all articles