24 Punkte von GN⁺ 2024-09-30 | 2 Kommentare | Auf WhatsApp teilen

Seit Go 1.22 bietet die Standardbibliothek bessere Unterstützung für Routing

  • Früher musste Routing manuell behandelt werden, jetzt lässt es sich mit mux.HandleFunc einfach umsetzen
  • Durch das Hinzufügen einer Login-Middleware kann die Sicherheit verbessert werden

Wichtiger Hinweis zum eingebauten Router: Weiterleitungen durch abschließenden Slash

  • Wenn der Pfad /records/ angelegt wird, wird eine Anfrage an /records auf /records/ umgeleitet
  • Dadurch kann der Request-Body einer POST-Anfrage verloren gehen und die Anfrage in eine GET-Anfrage umgewandelt werden
  • Die Lösung ist, API-Endpunkte wie POST /records statt POST /records/ zu verwenden

Automatische Generierung von Datenbank-Abfragecode mit sqlc

  • Das Tool sqlc wurde entdeckt, mit dem sich SQL-Abfragen schreiben lassen, ohne ein ORM lernen zu müssen
  • Geschriebene SQL-Abfragen werden automatisch in Go-Code umgewandelt
  • So lassen sich benötigte SQL-Abfragen einfach schreiben, ohne in der Dokumentation eines ORM nachschlagen zu müssen

Tipps zur Optimierung von sqlite

  • Für die Datenbank ein Schreibobjekt verwenden und db.SetMaxOpenConns(1) setzen
  • Um die Lesegeschwindigkeit zu erhöhen, separate DB-Objekte für Schreiben und Lesen verwenden
  • Zwei Tabellen, die keinen JOIN benötigen, können in getrennte Datenbanken gelegt und unabhängig verbunden werden

Konfiguration des GC-Speicherlimits in Go 1.19

  • Wenn alle Go-Projekte auf VMs mit relativ wenig Speicher wie 256 MB oder 512 MB ausgeführt wurden, trat das Problem auf, dass Anwendungen immer wieder durch OOM beendet wurden
  • Aufgrund der Standardkonfiguration des Garbage Collectors darf Speicher bis zum Doppelten der aktuellen Heap-Größe zugewiesen werden
  • In Go 1.19 wurde eine Möglichkeit hinzugefügt, die Anwendung anzuweisen, den GC auszuführen, sobald ein bestimmter Speicherverbrauch erreicht ist
  • Nachdem das GC-Speicherlimit auf 250 MB gesetzt wurde, traten OOM-Abbrüche seltener auf export GOMEMLIMIT=250MiB

Warum Websites mit Go bauen

  • Deployment ist mit einer einzelnen statischen Binärdatei einfach
  • Es gibt einen eingebauten Webserver, der produktionsreif ist, sodass kein WSGI oder Ähnliches konfiguriert werden muss
  • Die Toolchain von Go ist einfach zu installieren und zu verwenden
  • Das Senden von HTTP-Antworten ist unkompliziert, was die Wartung von Projekten erleichtert
  • Da net/http in der Standardbibliothek enthalten ist, lassen sich Websites ohne zusätzliche Bibliotheken erstellen
  • Auch systemnahe Aufgaben lassen sich leicht erledigen
  • Alles wirkt so, als wäre es darauf ausgelegt, Projekte einfach handhabbar zu machen

Noch ungelöste Probleme

  • Dinge, die in Go noch nicht viel ausprobiert wurden
    • Rendern von HTML-Templates
    • Implementierung eines echten Login-Systems
    • Implementierung von CSRF
  • Generell werden Projekte, die Login/CSRF usw. benötigen, nicht begonnen, weil unklar ist, wie sich sicherheitskritische Funktionen richtig umsetzen lassen

Es ist spannend, neue Go-Features zu sehen

  • Die beiden in diesem Text erwähnten Go-Features (GOMEMLIMIT und Routing) wurden in den letzten Jahren neu hinzugefügt
  • Wahrscheinlich sollte den Release Notes neuer Go-Versionen mehr Aufmerksamkeit geschenkt werden

2 Kommentare

 
secret3056 2024-09-30

sqlc ist wirklich großartig.

 
GN⁺ 2024-09-30
Hacker-News-Kommentare
  • Mit Go kann man fünf Tage an einem Projekt arbeiten, es dann zwei Jahre liegen lassen und anschließend ohne Probleme wieder daran weitercoden.
  • Ich habe vor einigen Jahren angefangen, Go zu lernen, aber die Sprache hat sich kaum verändert, sodass sie auch nach langer Zeit noch nützlich ist.
  • Schade, dass im Webentwicklungsbeitrag zu Go das Paket embed nicht erwähnt wurde.
    • Das Bündeln statischer Ressourcen in einer einzigen Binärdatei ist sehr praktisch.
  • Datenbanktransaktionen sind darauf ausgelegt, zu scheitern, daher sollte man immer eine Retry-Schleife verwenden.
    • Es ist gut, der Transaktionsschleife Context hinzuzufügen, damit sie abgebrochen werden kann.
  • sqlc hat einige wichtige Einschränkungen und kleinere Unannehmlichkeiten, daher sollte man vor der Nutzung die Liste der Issues prüfen.
    • Dynamische Queries, Eins-zu-viele-Beziehungen, eingebettete CTEs, zusammengesetzte Typen usw. werden nicht unterstützt.
    • Für einfache Anforderungen ist es geeignet, bei komplexeren Aufgaben sollte man manuell vorgehen.
  • Wenn Go in einem Container läuft, sollte GOMAXPROCS passend gesetzt werden, um CPU-Throttling zu vermeiden.
  • Mit GOMEMLIMIT muss man sich weniger Sorgen um die GC machen.
    • Bei Verwendung von Kubernetes oder Docker kann das automatisch gesetzt werden.
  • html/template ist seltsam und hat viele Probleme, daher sollte man es besser nicht verwenden.
    • Stattdessen wird Templ bevorzugt.
  • Die Erwähnung des Routings war erfreulich.
    • Ich war lange an mux gewöhnt, hatte aber die Funktionen der neueren Releases nicht beachtet.
  • Ich nutze Go seit einem Monat im neuen Job, mag es aber nicht.
    • Go wirkt, als hätte es aus 20 Jahren Sprachentwicklung nichts gelernt.
    • Durch das nil-Problem werden selbst einfache Aufgaben kompliziert.
  • Bei SQLite ist es sinnvoll, einen Single-Thread-Writer-Pool und einen separaten Lese-Pool zu verwenden.
    • Mit BEGIN CONCURRENT lässt sich die Parallelität verbessern.
  • Ich liebe die Einfachheit von Go und dass es keine Framework-Abhängigkeit gibt.
    • Schon mit der Standardbibliothek und bewährten Third-Party-Bibliotheken kann man großartige Dinge bauen.
    • Go eignet sich gut, wenn man Web-Apps oder CLI-Tools bauen will.
    • Ich mag die explizite Fehlerbehandlung.
    • Ich bin ein großer Go-Fan.