Wie beliebt ist die Go-Sprache? Ausländische Länder wie Google, AWS, Cloudflare, CoreOS usw. sowie inländische Unternehmen wie Qiniu und Alibaba haben begonnen, die Go-Sprache zu nutzen, um ihre Cloud-Computing-bezogenen Produkte in großem Maßstab zu entwickeln. Auf welche Ja und Aber sollte ich beim Einsatz der Go-Sprache achten? Kürzlich haben wir eine API mit der Go-Sprache entwickelt, einer Open-Source-Programmiersprache, die 2009 von Google eingeführt wurde. Im Prozess der Nutzung von Go für die Entwicklung haben wir viel Erfahrung gesammelt und möchten sie mit den Lesern teilen, daher haben wir diesen Artikel.
Wenn Sie eine Programmiersprache für ein Projekt auswählen, empfehlen wir immer, zu verstehen, worin das Projekt aufbauen wird, bevor Sie entscheiden, auf welcher Programmiersprache Sie aufbauen möchten. Lass das Produkt der entscheidende Faktor sein, wie es gebaut werden sollte.
Hier sind einige der Vor- und Nachteile, die wir beim Entwickeln mit Go gefunden haben, um Ihnen zu helfen, zu verstehen, ob es gut zu Ihrem nächsten Projekt passt.
Was wir an Go lieben
Die Verwendung der Go-Sprache ist in den letzten Jahren explodiert. Es scheint, als würden alle Start-ups sie für Backend-Systeme nutzen. Es gibt viele Gründe, warum die Entwickler es für so beliebt halten.
Die Go-Sprache ist sehr schnell
Go ist eine sehr schnelle Programmiersprache. Da Go in Maschinencode kompiliert wird, übertrifft es natürlich Programmiersprachen, die interpretativ sind oder eine virtuelle Laufzeit besitzen. Go-Programme kompilieren auch sehr schnell und erzeugen sehr kleine Binären. Unsere API wird in nur wenigen Sekunden kompiliert, was zu einer ausführbaren Datei führt, die nur 11,5 MB groß ist.
Leicht zu meistern
Die Syntax der Go-Sprache ist im Vergleich zu anderen Sprachen einfach und leicht zu verstehen. Du kannst dir die meisten Syntaxen von Go im Kopf merken, was bedeutet, dass du nicht viel Zeit mit der Suche verbringen musst. Die Go-Sprache ist außerdem sehr sauber und leicht lesbar. Non-Go-Programmierer, besonders diejenigen, die an C-ähnliche Syntax gewöhnt sind, können Go-Programmcode lesen und verstehen, was passiert.
Statische Typdefinitionssprache
Go ist eine mächtige statische Typ-definierende Sprache. Es gibt Grundtypen wie int, byte und string. Es gibt auch Arten von Strukturen. Wie bei jeder stark typisierten Sprache ermöglicht das Typsystem dem Compiler, Fehler für die gesamte Klasse zu erkennen. Die Go-Sprache hat außerdem eingebaute Listen- und Mapping-Typen, und sie sind zudem einfach zu bedienen.
Schnittstellentyp
Die Go-Sprache hat Schnittstellentypen, und jede Struktur kann eine Schnittstelle einfach erfüllen, indem sie die Schnittstelle implementiert. Das ermöglicht es dir, Abhängigkeiten in deinem Code zu entkoppeln. Du kannst dann deine Abhängigkeiten in deinen Tests simulieren. Durch die Nutzung von Schnittstellen kann man modulareren, testbaren Code schreiben. Die Go-Sprache verfügt außerdem über erstklassige Funktionen, was es Entwicklern ermöglicht, Code praktischer zu schreiben.
Standardbibliothek
Die Go-Sprache hat eine ziemlich gute Standardbibliothek. Es bietet bequeme integrierte Funktionen zur Handhabung grundlegender Typen. Einige Pakete machen es einfach, einen Webserver zu bauen, I/O zu verwalten, Verschlüsselung zu verwenden und Rohbytes zu bearbeiten. Die von der Standardbibliothek bereitgestellte JSON-Serialisierung und Deserialisierung ist sehr einfach. Mit "Tags" kannst du den JSON-Feldnamen neben dem Struct-Feld angeben.
Testunterstützung
Testunterstützung ist in die Standardbibliothek integriert und erfordert keine zusätzlichen Abhängigkeiten. Wenn du eine Datei namens thing.go hast, schreibe Tests in einer anderen Datei namens thing_test.go und führe "go test" aus. Go wird diese Tests schnell durchführen.
Statische Analysewerkzeuge
Die statischen Analysetools für die Go-Sprache sind zahlreich und leistungsfähig. Ein bestimmtes Tool ist gofmt, das Code nach Gos empfohlenem Stil formatiert. Dies kann viele Meinungen des Projekts normalisieren und dem Team-Award Manager ermöglichen, sich auf die Arbeit des Codes zu konzentrieren. Wir nutzen Gofmt, Golint und Vet bei jedem Build, und wenn wir Warnungen finden, scheitert der Build.
Müllabfuhr
Bei der Entwicklung der Go-Sprache wurde das Speichermanagement bewusst so gestaltet, dass es einfacher ist als C und C++. Das Ziel der dynamischen Allokation ist die Garbage Collection. Die Go-Sprache macht die Verwendung von Zeiger sicherer, da sie keine Zeigeroperationen erlaubt. Die Möglichkeit, Werttypen zu verwenden, wird ebenfalls angeboten.
Einfacheres Nebenläufigkeitsmodell
Während gleichzeitiges Programmieren nie einfach ist, ist Go leichter gleichzeitig zu programmieren als andere Sprachen. Einen leichtgewichtigen Thread namens "goroutine" zu erstellen und mit ihm über "Kanal" zu kommunizieren, ist fast eine einfache Aufgabe, aber für komplexere Modelle ist es möglich.
Was uns an Go nicht gefällt
Wie wir bereits besprochen haben, ist Go tatsächlich eine ausgezeichnete Sprache. Es hat eine saubere Syntax und ist schnell auszuführen. Es hat auch viele Vorteile. Aber das Ganze einer Programmiersprache bezieht sich nicht nur auf ihre Syntax. Hier sind einige der Probleme, denen wir begegnet sind.
Es gibt keine Generika
Erstens ist dieses Problem, wie ein Elefant im Raum, eine offensichtliche und übersehene Tatsache. In der Go-Sprache gibt es keine Generika. Für Entwickler aus Sprachen wie Java ist der Wechsel zu Go eine große Hürde. Das bedeutet, dass das Wiederverwendung des Codes reduziert wird. Obwohl die Go-Sprache erstklassige Funktionen hat, kann man bei Schreibfunktionen wie "map", "reduce" und "filter", die für eine bestimmte Art von Sammlungen ausgelegt sind, diese Funktionen nicht für andere verschiedene Arten von Sammlungen wiederverwenden. Es gibt viele Wege, dieses Problem zu lösen, aber am Ende schreiben sie alle mehr Code, was Produktivität und Wartbarkeit verringert.
Die Schnittstelle ist implizit
Obwohl es schön ist, Schnittstellen zu haben, implementiert die Struktur Schnittstellen implizit statt explizit. Dies gilt als eine der Stärken der Go-Sprache, aber wir fanden es schwierig anhand der Struktur zu erkennen, ob sie Schnittstellen implementiert hat oder nicht. Man kann es nur wirklich verstehen, wenn man versucht, das Programm zu kompilieren. Wenn das Programm klein ist, ist daran sicherlich nichts auszusetzen. Aber wenn dieses Programm mittelgroß bis groß ist, ist das Problem groß.
Schlechte Bibliotheksunterstützung
Der Support für die Go-Bibliothek ist uneinheitlich. Unsere API integriert sich mit Contentful, aber letzteres hat kein offiziell unterstütztes Go SDK. Das bedeutet, dass wir schreiben (und aufrechterhalten!) müssen. Viel Code, um Daten in Contentful anzufordern und zu analysieren. Wir müssen uns auch auf Drittanbieter-Elasticsearch-Bibliotheken verlassen. Go-SDKs, die von Anbietern bereitgestellt werden, sind nicht so beliebt wie ihre Java-, Ruby- oder JavaScript-Pendants.
Die Kommunikation in der Gemeinschaft ist schwierig
Die Go-Community nimmt Vorschläge möglicherweise nicht an. Betrachten Sie dies im GitHub-Repository von Golint:Der Hyperlink-Login ist sichtbar., bat ein Nutzer, dass Golint den Build versagen kann, wenn eine Warnung gefunden wird (was wir im Projekt tun). Die Verteidiger wiesen die Idee sofort zurück. Da jedoch zu viele Leute das Problem kommentierten, mussten die Wartungsverantwortlichen nach einem Jahr schließlich die gewünschten Funktionen hinzufügen.
Auch die Go-Community scheint Webframeworks nicht zu mögen. Obwohl die HTTP-Bibliothek der Go-Sprache viele Aspekte abdeckt, unterstützt sie weder Pfadparameter, Eingabeprüfung noch Validierung, noch die querschnittlichen Anliegen, die in Webanwendungen üblich sind. Ruby-Entwickler haben Rails, Java-Entwickler haben Spring MVC und Python-Entwickler haben Django. Viele Go-Entwickler entscheiden sich jedoch dafür, Frameworks zu vermeiden. Die Realität ist jedoch, dass es keine Rahmenwerke gibt, im Gegenteil, es gibt viele. Aber sobald man anfängt, ein Framework für ein Projekt zu verwenden, ist es nahezu unmöglich, dem Schicksal des Verlassens zu entgehen.
Fragmentiertes Abhängigkeitsmanagement
Lange Zeit hatte die Go-Sprache keinen stabilen, formellen Paketmanager. Nach jahrelangem Bitten in der Community hat das Go-Projekt erst kürzlich Godep veröffentlicht. Davor gab es bereits viele Werkzeuge, um diese Lücke zu schließen. Wir nutzen in unserem Projekt einen sehr leistungsstarken Govendor, aber das bedeutet, dass die Community gespalten ist, was für Entwickler, die neu in der Go-Sprache sind, sehr verwirrend sein kann. Außerdem werden fast alle Paketmanager von Git-Repositories betrieben, und die Geschichte der Git-Repositories kann sich jederzeit ändern. Vergleiche es mit Maven Central, das die Bibliotheken, auf die dein Projekt angewiesen ist, nie löscht oder ändert.
Entscheiden Sie, ob Sie Go verwenden wollen oder nicht
Manchmal muss man an die Maschine denken. Wenn du Bytes sendst und empfängst. Wenn du tausende gleichzeitige Prozesse betreust. Möglicherweise schreiben Sie auch ein Betriebssystem, ein Containersystem oder einen Blockchain-Knoten. In solchen Fällen werden Generika höchstwahrscheinlich egal sein. Weil du damit beschäftigt bist, Leistung pro Nanosekunde aus dem Chip herauszupressen.
Oft muss man jedoch an Menschen denken. Geschäftsdaten, mit denen Sie arbeiten müssen: Kunden, Mitarbeiter, Produkte, Bestellungen. Sie müssen die Geschäftslogik schreiben, die auf diesen Domänenentitäten arbeitet, und Sie müssen diese Geschäftslogik über viele Jahre aufrechterhalten. Und sie muss mit sich ändernden Bedürfnissen umgehen, und je schneller, desto besser. In diesen Fällen ist die Erfahrung des Entwicklers wichtig.
Go ist eine Programmiersprache, die Maschinenzeit höher schätzt als menschliche Zeit. Manchmal ist in Ihrem Fachgebiet die Leistung von Maschinen oder Programmer am entscheidendsten. In diesen Fällen kann Go eine gute Alternative zu C oder C++ sein. Aber wenn man eine typische n-Tier-Anwendung schreibt, entstehen oft Leistungsengpässe in der Datenbank und, noch wichtiger, in der Frage, wie man die Daten modellieren will.
Wenn Sie entscheiden, ob Sie die Go-Sprache verwenden möchten, beachten Sie die folgenden Faustregeln:
- Wenn du mit Bytes zu tun hast, könnte die Go-Sprache eine gute Wahl sein.
- Wenn du mit Daten zu tun hast, ist die Go-Sprache vielleicht keine gute Wahl.
Das könnte sich eines Tages in der Zukunft ändern. Die Go-Sprache und -Gemeinschaft sind noch jung. Sie könnten uns mit der Ergänzung von Generika überraschen; Oder ein beliebtes Web-Framework wird groß gewinnen. Vorerst bleiben wir jedoch bei ausgereiften Programmiersprachen mit universeller Unterstützung, ausgereiftem Abhängigkeitsmanagement und einem Fokus auf Geschäftsdomänenmodellierung.
|