Von PHP zu Go: Was mich am längsten kostete, umzudenken
Ich habe sieben Jahre lang PHP geschrieben. Fünf davon habe ich Laravel genutzt. Als ich zu Go wechselte, um eine Migration von einem Laravel-Monolithen zu Microservices zu leiten, kam ich nicht mit einem Tutorial. Ich kam mit einem Jahrzehnt an PHP-Gewohnheiten.
Das Erlernen der Syntax war einfach. Man kann Go an einem Nachmittag lesen. Der schwierige Teil war, das alte Denken über Code abzulegen.
Hier sind die mentalen Umstellungen, deren Beherrschung mich Monate gekostet hat:
Error Handling In PHP habe ich try/catch verwendet. Fehler wurden oft unsichtbar an einen globalen Handler weitergeleitet. In Go sind Fehler Werte. Eine Funktion gibt einen Fehler als letzten Wert zurück. Man muss ihn direkt dort behandeln. Zuerst fühlte sich das nach Mehrarbeit an. Später wurde mir klar, dass es Fehler sichtbar macht. Wenn ein Service fehlschlägt, fungiert die Fehlermeldung wie eine Spur aus Brotkrumen. Sie sagt dir genau, wo der Fehler aufgetreten ist, ohne einen massiven Stacktrace zu benötigen.
Memory and State PHP nutzt ein Shared-Nothing-Modell. Jeder Request beginnt mit einer leeren Weste. Memory Leaks sind weniger problematisch, da der Prozess nach dem Request endet. Go ist anders. Der Prozess bleibt über Tausende von Requests hinweg aktiv. Das bedeutet, dass eine Variable auf Package-Ebene über jeden Request hinweg geteilt wird. Wenn zwei Requests versuchen, gleichzeitig in eine Map zu schreiben, stürzt das gesamte Programm ab. In Go liegt die Verantwortung für die Concurrency bei dir. Du musst Tools wie den Race Detector verwenden, um die Sicherheit zu gewährleisten.
The Role of Context In PHP ist der Request die Grenze. Wenn der Request endet, stoppt alles. In Go stoppt nichts automatisch. Wenn ein Client die Verbindung trennt, laufen deine Goroutines möglicherweise weiter und verschwenden Ressourcen. Du musst context.Context verwenden, um Abbruchsignale durch deinen Code zu leiten. Es ist das Rückgrat, das deinen Service unter hoher Last gesund hält.
Composition Over Inheritance Laravel setzt stark auf das Erweitern von Basisklassen. Man fügt Funktionen hinzu, indem man Verhalten erbt. Go hat keine Klassenerbung. Es nutzt Interfaces, die implizit erfüllt werden. Du definierst, was du brauchst, dort, wo du es verwendest. Das macht den Code einfacher zu testen und auszutauschen. Ich musste meinen Instinkt, alles zu erweitern, ablegen, um guten Go-Code zu schreiben.
Clarity Over Cleverness PHP erlaubt Magic Methods und dynamische Typisierung. Man kann cleveren, ausdrucksstarken Code schreiben. Go ist bewusst langweilig. Der Compiler zwingt dich zur Verwendung von Standard-Formatierung und verhindert ungenutzte Variablen. Zuerst fühlte sich das einschränkend an. Jetzt schätze ich es. Go optimiert für die Person, die den Code liest, nicht für die Person, die ihn schreibt. Langweiliger Code lässt sich um 2 Uhr morgens während eines Vorfalls leicht reparieren.
Der schwierige Teil beim Erlernen einer neuen Sprache ist nicht die neue Syntax. Es sind die alten Annahmen, die man mit sich herumträgt.
Source: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn
