Liste gängiger Strukturen/Schnittstellen in 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>
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)
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]
,这意味着它的 Add
Methode wie diese:
func (l *List) Add(el int) { l.Elements = append(l.Elements, el) }
Versuchen Sie dann, es einem Segment von Objekten hinzuzufügen, die diese Schnittstelle implementieren:
Add(v any)
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]
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)
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]{})
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) }
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
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!

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



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)

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.

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.

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.

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.

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.

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.

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).
