Die wichtigsten Funktionen der Go-Sprache sind: 1. Gleichzeitige Programmierung; Die gleichzeitige Programmierung in der Go-Syntax ist extrem einfach, es besteht keine Notwendigkeit, sich mit Rückrufen zu befassen, keine Notwendigkeit, auf Thread-Wechsel zu achten, nur ein Schlüsselwort, einfach und natürlich. 2. Automatische Speicherbereinigung; Programmierer müssen nicht mehr über Speicherrecycling nachdenken, aber die Sprachfunktionen bieten einen Speicherbereinigungsspeicher, um Speicher zurückzugewinnen. 3. Umfangreichere integrierte Typen. 4. Mehrere Rückgabewerte von Funktionen. 5. Fehlerbehandlung. 6. Anonyme Funktionen und Schließungen. 7. Typen und Schnittstellen. 8. Durch Reflection können Entwickler den Typ selbst als erstklassigen Werttyp behandeln. 9. Sprachinteraktivität.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Die wichtigste Merkmale der GO-Sprache sind wie folgt:
Concurrent Programming
automatische Müllsammlung integrierten Typen
Fehler beim Umgang mit
anonymen Funktionen und Schließungen
Typen und Schnittstellen
Reflexion
Sprachinteraktivität
Man kann sagen, dass Goroutine das wichtigste Merkmal von Go ist. Es verwendet einen Coroutine-ähnlichen Ansatz zur Handhabung gleichzeitiger Einheiten, führt aber auch eine tiefere Optimierung auf Laufzeitebene durch. Dies macht die syntaktische gleichzeitige Programmierung extrem einfach. Es besteht keine Notwendigkeit, sich mit Rückrufen zu befassen, keine Notwendigkeit, auf den Thread-Wechsel zu achten, nur ein Schlüsselwort, einfach und natürlich. Go-Sprache ist in Bezug auf die gleichzeitige Programmierung viel einfacher als die meisten Sprachen. Dies ist einer ihrer größten Höhepunkte und ein wichtiger Verhandlungsvorteil für den Einstieg in Szenarien mit hoher Parallelität und hoher Leistung.
Im Gegensatz zu herkömmlichen Multiprozessen oder Multithreads ist die gleichzeitige Ausführungseinheit von Golang eine Coroutine namens Goroutine. Da Sperren in gemeinsam genutzten Datenszenarien in Verbindung mit GC verwendet werden, ist die Parallelitätsleistung manchmal nicht so gut wie beim asynchronen Multiplexing-IO-Modell. Daher ist Golangs Einfachheit der gleichzeitigen Programmierung im Vergleich zu den meisten Sprachen ein größeres Verkaufsargument als die Parallelitätsleistung. Im heutigen Multi-Core-Zeitalter liegt die Bedeutung der gleichzeitigen Programmierung auf der Hand. Natürlich unterstützen viele Sprachen Multithread- und Multiprozessprogrammierung, aber leider ist die Implementierung und Steuerung nicht so einfach und angenehm. Der Unterschied zu Golang besteht darin, dass die Sprachebene die Parallelität von Coroutinen (Goroutinen) unterstützt (Coroutinen werden auch als Mikro-Threads bezeichnet, die leichter, kostengünstiger und leistungsfähiger sind als Threads) Die Sprachebene bietet Schlüsselwörter (go) werden zum Starten von Coroutinen verwendet, und Tausende von Coroutinen können auf demselben Computer gestartet werden. Coroutinen werden oft als leichtgewichtige Threads verstanden, und der gemeinsam genutzte Heap teilt sich den Stapel nicht. Coroutinen werden im Allgemeinen explizit von der Anwendung geplant, und der Kontextwechsel muss nicht bis zur Kernel-Ebene erfolgen, was wesentlich effizienter ist. Im Allgemeinen gibt es keine synchrone Kommunikation zwischen Coroutinen, aber es gibt zwei Arten der Kommunikation zwischen Coroutinen in Golang: 1) Shared-Memory-Typ, der globale Variablen + Mutex-Sperren verwendet, um die Datenfreigabe zu erreichen; 2) Message-Passing-Typ, der ein eindeutiges Some verwendet Kanalmechanismen führen eine asynchrone Kommunikation durch.Wenn man das Multithreading von JAVA und die Coroutine-Implementierung von GO vergleicht, ist es offensichtlich direkter und einfacher. Das ist der Reiz von GO: Probleme auf einfache und effiziente Weise zu lösen. Das Schlüsselwort go ist vielleicht das wichtigste Symbol der GO-Sprache.
Hohe Parallelität ist das größte Highlight der Golang-Sprache
Speicherrecycling (GC)
Von C bis C++ ermöglichen diese beiden Sprachen Programmierern aus Sicht der Programmleistung, den Speicher selbst zu verwalten. einschließlich Speicheranwendung und -freigabe usw. Da es keinen Garbage-Collection-Mechanismus gibt, läuft C/C++ sehr schnell, allerdings muss der Programmierer die Speichernutzung sorgfältig berücksichtigen. Denn selbst eine kleine Nachlässigkeit kann zu „Speicherlecks“ führen, die Ressourcen verschwenden, oder zu „wilden Zeigern“, die Programmabstürze verursachen. Obwohl C++11 später das Konzept der intelligenten Zeiger verwendete, müssen Programmierer immer noch sehr vorsichtig damit umgehen. Später führten Hochsprachen wie Java und C# den GC-Mechanismus ein, um die Geschwindigkeit der Programmentwicklung und die Robustheit des Programms zu verbessern, d Sprachfunktionen bieten einen Garbage Collector zum Recycling von Speicher. Was jedoch folgt, kann sein, dass die Effizienz der Programmausführung sinkt.Der GC-Prozess besteht darin, zuerst die Welt anzuhalten, alle Objekte zu scannen, um festzustellen, ob sie lebendig sind, die recycelbaren Objekte in einem Bitmap-Bereich zu markieren, dann sofort die Welt zu starten, den Dienst wieder aufzunehmen und gleichzeitig eine spezielle Gorountine zu starten Recyceln Sie den Speicher in der freien Liste. Bereit zur Wiederverwendung und nicht physisch freigegeben. Die physische Freigabe wird regelmäßig von einem dedizierten Thread durchgeführt. Der GC-Flaschenhals besteht darin, dass alle Objekte jedes Mal gescannt werden müssen, um die Lebendigkeit zu bestimmen. Je mehr Objekte gesammelt werden müssen, desto langsamer ist die Geschwindigkeit. Ein Erfahrungswert ist, dass das Scannen von 100.000 Objekten 1 ms dauert. Versuchen Sie daher, eine Lösung mit weniger Objekten zu verwenden. Beispielsweise berücksichtigen wir verknüpfte Listen, Karten, Slices und Arrays zur gleichzeitigen Speicherung Karten sind ein Objekt und Slice oder Array sind ein Objekt, daher eignen sich Slice oder Array gut für GC. Die GC-Leistung wird möglicherweise kontinuierlich optimiert, da die Version ständig aktualisiert wird. Es gibt HotSpot-Entwickler im Team, daher sollten sie von den Designideen von jvm gc lernen, wie z. B. Generationsrecycling, Safepoint usw . Speicher wird automatisch recycelt und Entwickler müssen den Speicher nicht mehr verwalten Entwickler konzentrieren sich auf die Geschäftsimplementierung und reduzieren die mentale Belastung Nur neue Speicherzuweisung, keine Freigabe erforderlich Umfangreichere integrierte Typen Der Schlüssel liegt in integrierten Datentypen wie „Map“ und „Slice“. Sie müssen nicht selbst hinzugefügt werden. Mehrere Funktionsrückgabewerte In C, C++ und einigen anderen Hochsprachen werden mehrere Funktionsrückgabewerte nicht unterstützt. Da diese Funktion jedoch tatsächlich benötigt wird, wird der Rückgabewert in der C-Sprache im Allgemeinen als Struktur definiert oder in Form einer Funktionsparameterreferenz zurückgegeben. In der Go-Sprache als neuer Sprache besteht das Ziel darin, sie als leistungsstarke Sprache zu positionieren, und natürlich kann die Erfüllung dieser Anforderung nicht aufgegeben werden. Daher ist es notwendig, mehrere Rückgabewerte von Funktionen zu unterstützen. Beim Definieren der Funktion können Sie (a, b, c) nach den Eingabeparametern hinzufügen, was bedeutet, dass es 3 Rückgabewerte a, b, c gibt. Diese Funktion ist in vielen Sprachen verfügbar, beispielsweise in Python. Diese syntaktische Zuckerfunktion hat praktische Bedeutung. Beispielsweise benötigen wir häufig die Rückgabe eines Tripletts (errno, errmsg, data). In den meisten Sprachen, die nur einen Rückgabewert zulassen, können wir das Triplett nur verwenden In eine Karte oder ein Array übertragen und zurückgeben. Der Empfänger muss auch Code schreiben, um zu überprüfen, ob der Rückgabewert Tripel enthält. Wenn mehrere Rückgabewerte zulässig sind, wird dies direkt auf der Funktionsdefinitionsebene erzwungen, um den Code präziser zu gestalten und sicher. Sprachinteraktivität Sprachinteraktivität bezieht sich darauf, ob diese Sprache mit anderen Sprachen interagieren kann, z. B. beim Aufrufen von in anderen Sprachen kompilierten Bibliotheken. Die meisten C-Module werden direkt in der Go-Sprache wiederverwendet, hier Cgo genannt. Mit Cgo können Entwickler C-Sprachcode mischen und schreiben. Anschließend kann das Cgo-Tool diese gemischten C-Codes extrahieren und Aufrufpakete für C-Funktionscode generieren. Entwickler können grundsätzlich völlig ignorieren, wie die Grenze zwischen der Go-Sprache und der C-Sprache überschritten wird. golang kann mit C-Programmen interagieren, jedoch nicht mit C++. Es gibt zwei Alternativen: 1) Kompilieren Sie zuerst C++ in eine dynamische Bibliothek und rufen Sie dann einen Teil des C-Codes von go aus auf. Der C-Code ruft die dynamische Bibliothek dynamisch über die dlfcn-Bibliothek auf (denken Sie daran, LD_LIBRARY_PATH zu exportieren). Ich habe es noch nie gespielt) Ausnahmebehandlung golang unterstützt keine strukturierten Ausnahmelösungen wie try...catch, da davon ausgegangen wird, dass dadurch die Codemenge erhöht und missbraucht wird, egal wie klein, die Ausnahme ist, es wird geworfen. Die von Golang empfohlene Ausnahmebehandlungsmethode lautet: Gewöhnliche Ausnahme: Der Aufgerufene gibt das Fehlerobjekt zurück und der Aufrufer bestimmt das Fehlerobjekt. Schwerwiegende Ausnahme: Bezieht sich auf eine unterbrechende Panik (z. B. Division durch 0), die mithilfe des Defer...Recover...Panic-Mechanismus erfasst und verarbeitet wird. Schwerwiegende Ausnahmen werden im Allgemeinen automatisch intern von Golang ausgelöst und erfordern nicht, dass Benutzer sie aktiv auslösen, wodurch die Situation vermieden wird, dass überall traditionelles try...catch geschrieben wird. Natürlich können Benutzer auch panic('xxxx') verwenden, um aktiv zu werfen, aber dadurch wird dieser Mechanismus zu einem strukturierten Ausnahmemechanismus degeneriert. Reflection Die Go-Sprache bietet einen Mechanismus zum Aktualisieren und Überprüfen des Werts von Variablen, Aufrufmethoden von Variablen und intrinsische Operationen, die von Variablen zur Laufzeit unterstützt werden. Die Variablen sind jedoch zur Kompilierungszeit nicht bekannt. Typspezifisch ist dieser Mechanismus heißt Reflexion. Reflection ermöglicht es uns auch, den Typ selbst als erstklassigen Werttyp zu behandeln. Reflexion bezieht sich auf die Möglichkeit, während der Ausführung des Programms auf das Programm selbst zuzugreifen und es zu ändern. Beim Kompilieren des Programms werden die Variablennamen vom Compiler nicht in den ausführbaren Teil geschrieben. Wenn das Programm ausgeführt wird, kann das Programm keine Informationen über Sie selbst abrufen. Sprachen, die die Reflexion unterstützen, können die Reflexionsinformationen von Variablen wie Feldnamen, Typinformationen, Strukturinformationen usw. während der Programmkompilierung in die ausführbare Datei integrieren und dem Programm eine Schnittstelle für den Zugriff auf die Reflexionsinformationen bereitstellen , damit das Programm ausgeführt werden kann. Bietet Zugriff auf Typreflexionsinformationen und die Möglichkeit, diese zu ändern. Die C/C++-Sprache unterstützt die Reflexionsfunktion nicht und kann nur sehr abgeschwächte Programmlaufzeittypinformationen bereitstellen. Sprachen wie Java und C# unterstützen alle vollständige Reflexionsfunktionen. Aufgrund ihrer eigenen grammatikalischen Eigenschaften ermöglicht dies dem Code, zur Laufzeit auf die eigenen Wert- und Typinformationen des Programms zuzugreifen, sodass kein Reflexionssystem erforderlich ist. Das Reflexionssystem des Go-Sprachprogramms kann nicht alle Typinformationen in einem ausführbaren Dateibereich oder einem Paket abrufen. Es muss das entsprechende Lexikon, den Syntaxparser und den abstrakten Syntaxbaum (AST) in der Standardbibliothek verwenden, um den Quellcode zu scannen diese Informationen später. 【Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht】
Das obige ist der detaillierte Inhalt vonWas ist das wichtigste Merkmal der Go-Sprache?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!