Da PHP a Go: cosa mi è costato più tempo riprogrammare

Ho scritto PHP per sette anni. Per cinque di questi ho usato Laravel. Quando sono passato a Go per guidare una migrazione da un monolite Laravel a microservizi, non sono arrivato con un tutorial. Sono arrivato con un decennio di abitudini legate a PHP.

Imparare la sintassi è stato facile. Si può leggere il codice Go in un pomeriggio. La parte difficile è stata disimparare il mio modo di pensare il codice.

Ecco i cambiamenti mentali che mi hanno richiesto mesi per essere padroneggiati:

  • Gestione degli errori In PHP usavo try/catch. Gli errori spesso venivano gestiti invisibilmente da un handler globale. In Go, gli errori sono valori. Una funzione restituisce un errore come ultimo valore. Devi gestirlo proprio lì. All'inizio, questo mi sembrava un lavoro extra. In seguito, ho capito che rende il fallimento visibile. Quando un servizio fallisce, il messaggio di errore funge da scia di briciole. Ti dice esattamente dove è avvenuto il guasto senza una massiccia stack trace.

  • Memoria e Stato PHP utilizza un modello shared-nothing. Ogni richiesta parte da zero. I leak di memoria contano meno perché il processo termina dopo la richiesta. Go è diverso. Il processo rimane attivo per migliaia di richieste. Ciò significa che una variabile a livello di pacchetto è condivisa tra tutte le richieste. Se due richieste tentano di scrivere su una mappa contemporaneamente, l'intero programma va in crash. In Go, la gestione della concorrenza è tua responsabilità. Devi usare strumenti come il race detector per mantenere tutto sicuro.

  • Il ruolo del Context In PHP, la richiesta è il confine. Quando la richiesta termina, tutto si ferma. In Go, nulla si ferma automaticamente. Se un client si disconnette, le tue goroutine potrebbero continuare a girare sprecando risorse. Devi usare context.Context per passare i segnali di cancellazione attraverso il codice. È la spina dorsale che mantiene il servizio efficiente sotto carico elevato.

  • Composizione invece di Ereditarietà Laravel si basa pesantemente sull'estensione delle classi base. Aggiungi funzionalità ereditando il comportamento. Go non ha l'ereditarietà delle classi. Utilizza interfacce che vengono soddisfatte implicitamente. Definisci ciò di cui hai bisogno nel punto in cui lo usi. Questo rende il codice più facile da testare e sostituire. Ho dovuto soffocare l'istinto di estendere tutto per scrivere buon codice Go.

  • Chiarezza invece di Astuzia PHP permette l'uso di magic methods e del typing dinamico. Puoi scrivere codice astuto ed espressivo. Go è deliberatamente noioso. Il compilatore ti obbliga a usare la formattazione standard e impedisce l'uso di variabili non utilizzate. All'inizio, questo mi sembrava restrittivo. Ora, lo apprezzo. Go è ottimizzato per chi legge il codice, non per chi lo scrive. Il codice noioso è facile da correggere alle 2 del mattino durante un incidente.

La parte difficile nell'imparare un nuovo linguaggio non è la nuova sintassi. Sono le vecchie assunzioni che ti porti dietro.

Fonte: https://dev.to/econ__11/from-php-to-go-what-took-me-longest-to-rewire-2nfn