Heim > Artikel > Backend-Entwicklung > Das ist alles, was ich in ZWEI Wochen über Go gelernt habe!
Wie gehen Sie vor, wenn Sie etwas Neues lernen müssen? Ich habe ein ganz bestimmtes und habe es noch einmal getestet, während ich Golang lernte!
Es gibt zu viel Inhalt, um darüber zu reden, aber mein Ziel ist es hier, Dinge aufzulisten, die ich nützlich fand und für deren Erlernen ich mir ausdrücklich die Zeit genommen habe.
Seit 2 Wochen lerne und baue ich kleine Anwendungen mit Golang. Im Moment sind es fast 50 Stunden Code durch viele Livestreams und es war ziemlich toll, etwas zu lernen, bei dem ich zuvor ein paar kleine Probleme mit der Sprache hatte.
In dieser zweiwöchigen Reise habe ich Folgendes geschaffen:
Und das alles, weil mein Chef mich erneut gebeten hat, eine neue Technologie zu erlernen, um an einigen ScyllaDB PoCs und Demos zu arbeiten ... Ich war mit der Entscheidung nicht allzu zufrieden, aber nun ja, Es ist mein Job.
Im letzten Jahr habe ich Rust studiert und es ist wahrscheinlich immer noch zu komplex für mich, aber ich habe ein paar wirklich coole Konzepte gelernt, die dafür gesorgt haben, dass mein Wechsel zu Go wie ein Zauber funktioniert hat!
In diesem Artikel gebe ich Ihnen einige Tipps und Ratschläge, um Ihren Lernfluss zu beschleunigen.
Ich bin ein PHP-Entwickler und an die BESTE CLI gewöhnt, die jemals erstellt wurde (ja, es ist Artisan), aber im Laufe meiner Reise als Entwickler habe ich großartige Projekte erlebt, von denen viele ...:
Als ich zur Go-Umgebung kam, begann es als echtes Problem. Zumindest für mich könnte die Entwicklererfahrung von Golang in Bezug auf Tools und Dokumentation viel besser sein. Als ich darüber nachdachte, beschloss ich, drei Befehle durchzugehen, die man am Anfang LERNEN MÜSST.
Denken Sie daran: Dies ist nur eine exemplarische Vorgehensweise mit meiner eigenen Erklärung der Dinge. Wenn Sie detaillierte Informationen wünschen, öffnen Sie die Dokumente :)
Außerdem: Go Docs ist scheiße, bitte hat jemand dort einen Syntax-Highlighter eingefügt
Je nachdem, ob Sie Ihre Anwendung modularisieren oder eine organisierte Umgebung haben möchten, ist dies zunächst der nützlichste Befehl.
Der Befehl go mod verwaltet alle Abhängigkeiten innerhalb Ihres Projekts und kümmert sich auch um die automatische Entfernung aller nicht mehr verwendeten Elemente.
Initiieren wir zunächst in Ihrem neuen leeren Ordner ein neues Modul im Projekt mit go mod init:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Dadurch wird im Projektstamm eine neue Datei namens go.mod erstellt, die im Grunde den aktuellen Inhalt enthält:
Hier ist die Datei, falls Sie sie selbst überprüfen möchten:
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Das nächste, was mir danach wirklich gut gefallen hat, war der Go-Mod Tidy, der im Grunde alle fehlenden Abhängigkeiten hinzufügt und nicht verwendete entfernt.
go mod tidy
Das zweite dient nur dazu, sich daran zu erinnern, dass es das gibt und dass es wirklich nützlich ist! Wahrscheinlich wird Ihre Umgebung es JEDES MAL ausführen und Sie werden sich daran gewöhnen, dass Importe verschwinden :p
Dies ist wahrscheinlich der am häufigsten verwendete Befehl, da Sie Ihr Projekt ausführen MÜSSEN, aber so funktioniert es:
Das Wichtigste bei diesem Befehl ist, dass er beim Ausführen des Befehls „go run“ nach der Datei „go.mod“ in Ihrem aktuellen Verzeichnis sucht und diese als Grundlage für die Zuordnung Ihres gesamten Projekts (Importe, Pakete) verwendet , usw). Hier einige Beispiele:
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
Hier ist unser app.go-Inhalt:
package main import( "fmt" ) func main () { fmt.Println("whats up! don't forget to like this article <3") }
Jetzt kennen Sie die Grundlagen zur Durchführung eines Projekts! Im wahrsten Sinne des Wortes: Hallo Welt!
Mein Problem mit Go war schon immer die Art und Weise, wie es geschrieben ist, aber nach stundenlangem Programmieren wurde mir klar, dass es einfacher ist, als ich dachte. Wie Sie vielleicht schon erraten haben, verfüge ich über fundierte PHP-Kenntnisse und einige Erfahrung mit Rust.
Als ich 2023 anfing, Rust zu lernen, hielt glücklicherweise ein Typ, von dem ich ein großer Fan bin, Nuno Maduro (Laravel), einen Vortrag mit dem Titel „PHP für Rust-Entwickler“, der mir eine grundlegende Einführung in das Thema gab die Syntax und gab mir etwas Luft zum Atmen, während ich völlig von Rust ÜBERRASCHT war.
Jedenfalls hat es mir damals geholfen, also warum nicht ein paar Vergleiche anstellen?
In OOP haben wir Klassen, was eine wirklich coole Möglichkeit ist, Ihren Code in kleine Teile zu abstrahieren, und Sie haben so etwas „so etwas“. Golang kann als Odyssee betrachtet werden, denn es kann eine epische Entwicklung sein, die Umgebung so zu verändern, wie man sie haben möchte.
Denken Sie daran, dass Golang eine „High-Level-Sprache“ ist, die eine Syntax auf „Systemebene“ bietet, die es Ihnen ermöglicht, problemlos mit Implementierungen auf „Low-Level“ zu arbeiten.
Unter der Go-Syntax können Sie
Und Sie können es verwenden für: Strukturen, Strukturfelder, Strukturmethoden. Schauen Sie genauer hin:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
In Rust haben Sie einen expliziteren Ansatz (mehr Oop-ähnliche Sprachen), wobei:
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Ich würde Dinge wie PHP, Java usw. gerne explizit machen, aber wenn Sie darüber nachdenken, ist WENIGER CODE zu schreiben, aber es wirkt sich auch auf die Lesbarkeit aus.
Um ehrlich zu sein, gehöre ich zu der Art von Person, die versuchen würde, ich weiß nicht ... LARAVEL in die Go-Umgebung zu integrieren, aber das wurde bereits in Goravel gemacht. Jedenfalls gefällt mir die Idee, mit „Interface/Contract Driven Development“ zu arbeiten, sehr gut und ich bin zum ersten Mal in einer Sprache dabei hängengeblieben.
In Go werden Schnittstellen nicht in einer Struktur/Klasse „implementiert“, und für einen OOP-Typen wie mich ist es einfach verrückt, dass eine solche Designentscheidung in meinen Kopf passt. Schauen Sie sich an, was erwartet wird:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Nun, wenn es darum geht: Sie haben nicht diese explizite Implementierung einer „Schnittstelle“ innerhalb einer Struktur, und das ist, hmm... seltsam? Stattdessen implementieren Sie einfach die erforderlichen Methoden der Schnittstelle, die go zur Kompilierzeit für Sie überprüft. Es ist fair zu wissen, dass es sich um eine kompilierte Sprache handelt und dass es nie ein Problem sein sollte, aber ich spreche über meine Perspektive mit Developer Experience!
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Auf jeden Fall werden Sie sich mit der Zeit, in der Sie in der Sprache programmieren, daran gewöhnen. Lassen Sie uns nun darüber sprechen, was Ihnen die Basisumgebung bietet, ohne dass Sie etwas herunterladen müssen!
Jetzt spreche ich über alles, was Go Ihnen mit der Standardbibliothek bietet, ohne dass Sie ein Paket eines Drittanbieters herunterladen müssen. Hier ist eine chronologische Zeitleiste für Sie:
Damit mache ich keine Witze, jeden Tag, an dem ich go erkunde, habe ich neben den Standardbibliotheken eine coole Bibliothek gefunden. Beginnen wir also damit, über primitive Typen zu sprechen.
Wie PHP und im Gegensatz zu vielen anderen Sprachen (Rust, Java, JS usw.) benötigt Golang „Hilfs“--Funktionen, um die meisten zugehörigen Typ-Operationen auszuführen . Wir können sie als „anämische“ Typen betrachten, da mit ihnen kein „Nützlichkeitsfaktor“ verbunden ist.
go mod tidy
Wenn Sie also mit einem Typ „String“ arbeiten, stehen Ihnen andere Pakete wie strconv oder strings zur Verfügung, um ihn zu manipulieren! Aber hier ist eine goldene Regel, damit Sie nie vergessen, welches Paket Sie sich ansehen sollten: Wenn Ihr Typ ein String ist, suchen Sie nach demselben Paket mit einem pluralisierten Namen!
Kurz gesagt erhalten Sie dadurch Funktionen im Zusammenhang mit []Type und Type:
Schauen Sie sich den Code an, damit Sie ihn selbst validieren können:
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
Das soll einfach sein, aber ich habe eine Weile damit gekämpft, bis es mir in den Sinn kam. Vielleicht hat mich die jahrelange Nutzung von Laravel und seinen Hilfsfunktionen vergessen, wie schwierig es ist, ohne Framework zu programmieren :D
Während ich Tools und Projekte erkundete, bekam ich eine wirklich gute Einführung in viele Projekte und ich möchte jedes einzelne davon und die von mir verwendeten Bibliotheken auflisten:
Hier ist eine scrollbare Ansicht aller Paketimplementierungen, damit Sie sie überprüfen können. Es gibt VIELE coole Standardpakete, die hier zitiert werden können.
ACHTUNG: Das ist VIEL CODE! :p
Vergessen Sie nicht, Ihre Lieblingsfunktionen (außer Goroutinen und Kanälen) zu kommentieren :p
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Im Ernst, das ist einfach unglaublich! Also, machen wir jetzt weiter mit den Tests.
In meinem zweiten Projekt mit Go sah ich eine Möglichkeit, Tests zu lernen, während ich Requests and Responses-Objekte erstellte. Innerhalb der PHP-Umgebung verwenden Sie wahrscheinlich eine Bibliothek eines Drittanbieters wie PHPUnit oder Pest. Rechts? In der Go-Umgebung ist dies EINFACH! Alles was Sie tun müssen ist:
Nehmen wir an, wir haben „requests.go“ und „requests_test.go“ in unserem Paketordner, wobei „requests.go“ ist:
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Ein Test in Go gilt als BESTANDEN (grün), wenn (t *Testing.T).Errorf() nicht innerhalb Ihrer Testfunktion aufgerufen wird. Es folgt auch dem gleichen Kapselungskonzept, das zuvor eingeführt wurde:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Sie können zum Testen Ihre eigenen Hilfsfunktionen ausführen. Stellen Sie nur sicher, dass Sie bei diesen Tests nicht in die Moduldomäne eindringen!
Ich benutze Goland seit dem ersten Tag, daher sind die meisten Dinge für mich einfacher. Jedes Mal, wenn ich einen neuen Test starte, erhalte ich dieses Boilerplate mit einer Unity-Teststruktur, die standardmäßig parallel läuft (Goroutinen).
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Ok, jetzt wissen wir wie einfach es ist, Tests in Go zu zu schreiben, aber wie wäre es, wenn man sie durchführt?
Einfache Aufgabe
go mod tidy
6. Vorsicht vor zyklischen Importen Während meiner letzten Entwicklungsjahre habe ich immer versucht, alle meine Projekte so zu modularisieren, dass sie meinen Bedürfnissen entsprechen, ohne bei „Clean Arch“ oder „Domain Driven Design“-Zeug hängen zu bleiben . Bei meinen ersten Versuchen, meine Pakete aufzuteilen, bekam ich jedoch den Fehler
„Zyklischer Import“und dachte mir: Wie lange ist es her, dass ich so etwas gesehen habe? Während meiner zwei Jahre in PHP hatte ich das gleiche Problem mit der Importhölle, bei der man nicht
nicht ZWEIMAL dieselbe Datei importieren konnte in einem bestimmten Ablauf. Das war, bevor ich PSR-4 (Autoloading) kennenlernte (was meine PHP-Tage für immer veränderte!!) und jetzt, vor Jahren, habe ich in Go damit zu kämpfen.
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
package main import( "fmt" ) func main () { fmt.Println("whats up! don't forget to like this article <3") }
Und in diesem Moment müssen Sie damit beginnen, Ihre Abhängigkeiten/Pakete aufzuschlüsseln, um dies zu vermeiden.: Importieren Sie nicht dasselbe Paket an einem Ort, der viele Male geladen wird.TLDR
7. Dies aufschieben, jenes aufschieben ... Aber was ist ein Aufschieben? Ich habe nicht nachgeschlagen, aber es war das erste Mal, dass ich das reservierte Wort „defer“ in einer Programmiersprache gesehen habe. Und da es nicht zu den
„generisch reservierten Wörtern“gehörte, habe ich es eine ganze Woche lang ignoriert!
Dann gab mir einer meiner Arbeitskollegen, Dusan, eine Lektion zum Gedächtnismanagement in Go, nachdem er gesehen hatte, wie ich ein paar Stunden lang mit der Sprache zu kämpfen hatte. (Ja, das ist ein Dankeschön :p)Die Sache ist: Immer wenn Sie einen Puffer/eine Verbindung zu etwas öffnen, SOLLTEN Sie IHN SCHLIESSEN! Ich erinnere mich, als ich 2014 mit MapleStory-Servern (Java) arbeitete, war das häufigste Problem Speicherlecks, einfach weil die Entwickler die Verbindungen zur Datenbank nicht geschlossen haben.
Das darf man VERGESSEN! Aber es ist nicht in Ordnung, die Codeüberprüfung zu bestehen, LOL
Hier ist ein Beispiel in Java:
mkdir go-fodase cd go-fodase # go mod init <module-name> go mod init github.com/danielhe4rt/go-fodase
Beim Codieren von Golang geben sie dieses Verzögerungsattribut an, damit Sie daran denken, Ihre Dateien direkt nach dem Öffnen zu schließen.
Defer steht für „Deference“, was eine Möglichkeit ist, Ihre Ressourcen zu „zu bereinigen“, nachdem die Ausführung dieses bestimmten Teils des Codes beendet ist.
# folder: ~/go-fodase cat go.mod # module github.com/danielhe4rt/gofodase # # go 1.23.2
Sie können auch viele Verzögerungen innerhalb einer Funktion haben und die VERZÖGERUNGSREIHENFOLGE ist wichtig! Wenn Sie Datenbank2 und dann Datenbank1 zurückstellen, werden beide Prozesse in derselben Reihenfolge bereinigt.
go mod tidy
Dies ist eine wirklich einfache Möglichkeit, keinen Fehler zu machen und zu verhindern, dass Ihr Projekt einen Speicherverlust erleidet. Bitte denken Sie daran, es immer dann zu verwenden, wenn Sie etwas streamen.
Die Fehlerbehandlung sieht zunächst etwa so aus: Überprüfen Sie, ob die von Ihnen verwendete Funktion einen Fehlertyp zurückgibt, und validieren Sie ihn JEDES VERDAMMTE MAL! Hier ist ein Beispiel dafür, wovon ich spreche:
# go run <your-main-file> # Environment 1 # . # ├── go.mod # └── main.go go run app.go # Environment 2 # . # ├── go.mod # └── src # └── main.go go run src/app.go
Um ehrlich zu sein, hasse ich diese Syntax. Es ist jedoch Teil der Sprache und wird Ihnen im Laufe Ihrer Programmiertage begegnen.
Funktionen mit Fehlern können Fehler oder (T, Fehler) zurückgeben, und glücklicherweise lässt Go Sie das nicht vergessen.
package main import( "fmt" ) func main () { fmt.Println("whats up! don't forget to like this article <3") }
Spamen Sie Ihren Code mit err != nil und alles wird gut, das verspreche ich! :D
Abgesehen von all dem Stress und den Stunden, die ich damit verbracht habe, die Umgebung zu verstehen, war es eine coole Herausforderung, gemeinsam mit meinen Twitch-Zuschauern eine neue Sprache zu lernen. Viele von ihnen haben mich schon lange gebeten, es mir anzusehen, und hier sind wir.
Alle diese Punkte spiegeln meine persönlichen Entwicklungserfahrungen mit der Sprache wider, und das Ziel bestand darin, Dinge zu teilen, die ich während dieser zwei Wochen, in denen ich sie gelernt habe, durchgemacht habe.
Kürzlich wurde ich von meinem Teamkollegen herausgefordert, eine ScyllaDB-Herausforderung zu meistern, und dabei habe ich viel über Parallelität, Pools und Ratenbegrenzung gelernt. Vor dieser Art von Herausforderung stehen viele Unternehmen, um die Leistung ihrer Produkte zu verbessern!
Das Ziel der Herausforderung besteht darin, eine kleine Go-Befehlszeilenanwendung zu erstellen, die einige zufällige Daten in ScyllaDB einfügt und gleichzeitig die Anzahl der Anfragen begrenzt.
Die Repository-Challenge finden Sie hier: github.com/basementdevs/throttling-requests-scylla-test. Wir stellen auch ein! Die offenen Stellen finden Sie in unserem Karrierebereich!
Vielen Dank fürs Lesen! Ich hoffe, dieser Artikel hat wertvolle Einblicke in das Erlernen von Golang gegeben. Teilen Sie gerne Ihre Gedanken oder Erfahrungen mit.
Das obige ist der detaillierte Inhalt vonDas ist alles, was ich in ZWEI Wochen über Go gelernt habe!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!