Schița de curs
1. Introducere în Go
- Ce este Go (Golang)?
- Istoric și filozofia de design a Go
- Go ca limbaj de programare web și de sisteme
- Caracteristici principale:
- Tipare static
- Simplicitate și lizibilitate
- Compilare rapidă
- Concurență integrată
- Colectare de gunoi (garbage collection)
- Compilare cross-platform
- Cazuri de utilizare comune pentru Go
- Avantajele și limitările Go
- Comparația Go cu C/C++, JavaScript, Ruby, Python și Java
- Înțelegerea ecosistemului Go
- Prezentarea bibliotecii standard Go
- Module Go și gestionarea dependențelor
- Anatomia unei aplicații Go
- Practică hands-on: Examinarea și rularea unui program simplu Go
2. Configurarea mediului de dezvoltare Go
- Instalarea Go
- Înțelegerea toolchain-ului Go
- Configurarea variabilelor de mediu
- Alegerea unui IDE sau a unui editor de cod
- Utilizarea liniei de comandă cu Go
- Crearea unui workspace Go
- Înțelegerea structurii unui proiect Go
- Inițializarea unui proiect cu Go Modules
- Utilizarea
go mod init - Gestionarea dependențelor cu
go get - Actualizarea și examinarea dependențelor
- Formatarea codului sursă cu
gofmt - Rularea programelor cu
go run - Construirea aplicațiilor cu
go build - Instalarea aplicațiilor Go
- Compilarea cross-platform
- Practică hands-on: Crearea și configurarea unui proiect Go într-un container
3. Variabile, constante și tipuri în Go
- Declărarea variabilelor
- Tipuri explicite versus inferite
- Declărări scurte de variabile
- Constante
- Valorile zero
- Scopul și durata de viață a variabilelor
- Tipuri de date primitive:
- Numere întregi
- Numere cu virgulă mobilă
- Numere complexe
- Booleene
- Șiruri de caractere
- Conversii de tip
- Lucrul cu Unicode și UTF-8
- Runes și bytes
- Atribuirea multiplă de variabile
- Înțelegerea siguranței tipurilor
- Exercițiu: Construirea unui mic program de procesare a datelor din linia de comandă
4. Operatori și expresii
- Operatori aritmetici
- Operatori de comparație
- Operatori logici
- Operatori de asignare
- Incrementare și decrementare
- Prioritatea operatorilor
- Lucrul cu calcule de numere întregi și cu virgulă mobilă
- Evitarea erorilor comune de conversie a tipurilor
- Exercițiu: Implementarea logicii de calcul și validare
5. Date, ore și formatare
- Utilizarea pachetului
time - Crearea și manipularea datelor
- Obținerea timpului curent
- Fusele orare și locațiile
- Parcarea datelor și a orelor
- Formatarea datelor și a orelor
- Calcularea duratelor
- Lucrul cu timestamps Unix
- Managementul timeout-urilor
- Exercițiu: Adăugarea timestamps-urilor și a calculelor de durată într-o aplicație
6. Array-uri, slice-uri, map-uri și struct-uri
Array-uri
- Declărarea array-urilor
- Inițializarea array-urilor
- Iterarea prin array-uri
- Array-uri multidimensionale
Slice-uri
- Înțelegerea diferenței între slice-uri și array-uri
- Crearea slice-urilor
- Adăugarea de elemente (append)
- Copierea slice-urilor
- Lungimea și capacitatea slice-urilor
- Crearea de subslice-uri
- Piulețe comune ale slice-urilor
Map-uri
- Crearea map-urilor
- Adăugarea și ștergerea de intrări
- Verificarea existenței unei chei
- Iterarea prin map-uri
- Map-uri care conțin date complexe
Struct-uri
-
Definirea structurilor
-
Câmpurile structurilor
-
Inițializarea structurilor
-
Struct-uri imbricate
-
Struct-uri anonime
-
Metode ale structurilor
-
Tag-uri JSON pentru struct-uri
-
Practică hands-on: Modelarea utilizatorilor, a produselor și a datelor aplicației folosind struct-uri, slice-uri și map-uri
7. Logica condițională și bucle
- Enunțurile
if elseșielse if- Declărierea variabilelor în interiorul condițiilor
- Buclele
for - Bucle infinite
- Condițiile buclelor
breakșicontinue- Iterarea cu
range - Bucle imbricate
- Enunțurile
switch - Switch-uri bazate pe expresii
- Cazuri multiple
- Cazuri implicite (default)
- Switch-uri de tip
- Exercițiu: Implementarea logicii de validare și procesare a aplicației
8. Funcții
- Definirea funcțiilor
- Parametrii funcțiilor
- Valorile returnate
- Multe valori returnate
- Valori returnate cu nume
- Funcții variadice
- Funcții anonime
- Valori de funcții
- Closures
- Recursivitate
- Pasarea funcțiilor ca argumente
- Funcții care returnează erori
- Designul funcțiilor mici și reutilizabile
- Exercițiu: Refactorizarea codului existent în funcții reutilizabile
9. Pointere și concepte de memorie
- Ce este un pointer?
- Operatorii de adresă și de dereferențiere
- Pointere și parametrii de funcții
- Receivere cu pointer
- Pointere către struct-uri
- Pointere nil
- Când să folosești pointere
- Semantica de valoare versus referință
- Înțelegerea gestionării memoriei și a colectării de gunoi în Go
- Erori comune legate de pointere
- Practică hands-on: Modificarea datelor aplicației folosind pointere
10. Crearea unei aplicații web în Go
- Prezentarea capacităților web ale Go
- Introducere în pachetul
net/http - Crearea unui server HTTP
- Soliciteri și răspunsuri HTTP
- Metodele HTTP
- URL-urile solicitărilor și parametrii de interogare
- Header-ele HTTP
- Codurile de statut HTTP
- Fundamentele de routing
- Crearea de handler-e
- Procesarea datelor din formulare
- Servirea fișierelor statice
- Lucrul cu șabloane HTML (templates)
- Variabile și structuri de control în șabloane
- Structurarea unei aplicații web
- Practică hands-on: Construirea unui server web de bază în Go
11. Construirea unui serviciu web RESTful
- Fundamentele arhitecturii REST
- Designul endpoint-urilor API
- GET, POST, PUT, PATCH și DELETE
- Lucrul cu JSON
- Encodarea și decodarea JSON
- Validarea solicitărilor
- Codurile de statut HTTP
- Răspunsuri de eroare
- Parametri de interogare și parametri de cale
- Structura răspunsurilor API
- Separarea handler-elor de logica de business
- Practică hands-on: Construirea unui API REST CRUD
12. Runtime Go, compilare și build-uri de proiect
- Înțelegerea compilatorului Go
- Procesul de build în Go
go rungo buildgo installgo test- Flag-uri de build
- Configurarea specifică de mediu
- Construirea pentru diferite sisteme de operare și arhitecturi
- Producerea de binarii autonome (standalone)
- Gestionarea configurației aplicației
- Exercițiu: Compilarea aplicației pentru mai multe platforme
13. Lucrul cu fișiere și web
- Deschiderea și închiderea fișierelor
- Citirea fișierelor
- Scrierea fișierelor
- Crearea directorilor
- Metadatele fișierelor
- I/O tamponat (buffered)
- Lucrul cu fluxuri (streams)
- Citirea și scrierea fișierelor JSON
- Clienti HTTP
- Trimiterea de solicitări HTTP externe
- Tratarea erorilor clientului HTTP
- Timeout-uri și anulare
- Procesarea răspunsurilor API
- Practică hands-on: Recuperarea datelor dintr-un API extern și persistarea lor local
14. Gestionarea erorilor și debuging
- Abordarea Go pentru erori
- Returnarea erorilor din funcții
- Verificarea erorilor
- Crearea de erori personalizate
- Împachetarea erorilor (wrapping)
- Adăugarea de context la erori
errors.Isșierrors.As- Panic și recover
- Când să folosești
panic - Debuging-ul problemelor comune din Go
- Logarea activității aplicației
- Utilizarea instrumentelor de debuging Go
- Exercițiu: Diagnosticarea și corectarea erorilor deliberate introduse în aplicație
15. Interfețe și abstracție
- Ce este o interfață?
- Implementarea implicită a interfețelor
- Definirea interfețelor
- Valori de interfață
- Interfețe goale /
any - Aserțiuni de tip
- Switch-uri de tip
- Implementări cu pointer versus cu valoare
- Designul interfețelor mici
- Inversia dependențelor
- Utilizarea interfețelor pentru testare
- Reducerea cuplajului aplicației
- Practică hands-on: Introducerea interfețelor în aplicația web de exemplu
16. Pachete și organizarea proiectului
- Crearea pachetelor
- Convenții de numire a pachetelor
- Identificatori exportați și neexportați
- Importarea pachetelor
- Inițializarea pachetelor
- Organizarea straturilor aplicației
- Pachete interne (internal)
- Gestionarea dependențelor cu Go Modules
- Versionare semantică
- Utilizarea pachetelor terțe
- Evitarea dependențelor circulare
- Designul proiectelor Go menținabile
- Exercițiu: Refactorizarea aplicației în pachete separate
17. Concurență cu Goroutines
- Ce este concurența?
- Goroutines
- Pornirea goroutines-urilor
- Înțelegerea execuției concurente ușoare (lightweight)
- Provocări de sincronizare
- Stare partajată
- Condiții de cursă (race conditions)
- Utilizarea
sync.WaitGroup - Mutex-uri și mutex-uri de citire/scriere
- Operații atomice
- Practică hands-on: Conversia unei task-uri secvențiale în procesare concurentă
18. Channels
- Înțelegerea channels-urilor
- Trimitea și primirea de valori
- Channels tamponate versus netamponate
- Comportamentul blocant
- Închiderea channels-urilor
- Ranging pe channels
- Channels direcționale
- Comunicare bazată pe channels
- Enunțuri Select
- Timeout-uri și anulare
- Modelul worker-pool
- Modelul producător/consumator
- Practică hands-on: Construirea unui sistem de worker concurent
19. Context și managementul solicitărilor
- De ce contează contextele în aplicațiile web
context.Context- Context specific solicitării (request-scoped)
- Anulare
- Termene limită (deadlines)
- Timeout-uri
- Propagarea contextului prin straturile aplicației
- Anularea operațiilor de bază de date sau HTTP
- Evitarea utilizării incorecte a contextului
- Exercițiu: Adăugarea anulării solicitărilor și a timeout-urilor în aplicația web
20. Testarea aplicațiilor Go
- De ce contează testarea automată
- Scrierea de testuri unitare
- Pachetul
testing - Funcții de test
- Convenții de numire a testurilor
- Testuri bazate pe tabele (table-driven tests)
- Testarea erorilor
- Testarea handler-elor HTTP
- Servicii de test HTTP
- Fixture-uri de test
- Coperțura testurilor (coverage)
- Benchmarks
- Testuri de exemplu
- Testarea interfețelor cu mocks sau fakes
- Practică hands-on: Crearea unui suite de testuri pentru aplicația de exemplu
21. Optimizarea performanței
- Înțelegerea performanței aplicațiilor Go
- Identificarea gâtlecurilor (bottlenecks)
- Performanța CPU versus memorie
- Structuri de date eficiente
- Reducerea alocărilor inutile
- Șiruri, bytes și buffere
- Gestionarea goroutines-urilor
- Evitarea concurenței excesive
- Strategii de caching
- Considerații legate de baza de date și rețea
- Profilarea aplicațiilor
- Benchmarks și testare de performanță
- Utilizarea instrumentelor de profilare Go
- Exercițiu: Profilarea și optimizarea unei aplicații deliberate ineficiente
22. Siguranță și practici robuste pentru aplicații web
- Validarea input-ului utilizatorului
- Tratarea sigură a solicitărilor HTTP
- Prevenirea vulnerabilităților comune web
- Gestionarea sigură a erorilor
- Concepte de autentificare și autorizare
- Gestionarea secretelor și a configurației
- Comunicare HTTP sigură
- Evitarea informațiilor sensibile în loguri
- Gestionarea și actualizarea dependențelor
- Limite de resurse și timeout-uri de solicitare
- Exercițiu: Revizuirea și întărirea (hardening) API-ului de exemplu
23. Logging și observabilitate pentru aplicații
- Fundamentele de logging
- Logging structurat
- Niveluri de log
- Logging-ul solicitărilor
- Logging-ul erorilor
- Corelarea și ID-urile de solicitare
- Monitorizarea comportamentului aplicației
- Metrics de bază
- Endpoint-uri de verificare a sănătății (health-check)
- Diagnosticarea problemelor de producție
- Practică hands-on: Adăugarea de logging structurat și health checks
24. Containerizarea aplicației Go
- De ce să folosești containere?
- Aplicații Go și containerizare
- Scrierea unui Dockerfile
- Build-uri multi-stadiu (multi-stage)
- Construirea unei imagini de runtime minimale
- Gestionarea configurației prin variabile de mediu
- Rețea de containere
- Expunerea porturilor aplicației
- Rularea aplicației într-un container
- Testarea aplicației containerizate
- Practică hands-on: Împachetarea aplicației Go de exemplu ca un container gata de producție
25. Implementare (Deployment)
- Pregătirea aplicației pentru producție
- Construirea binariilor de producție
- Configurarea mediului
- Implementarea bazată pe containere
- Arhitectura de deployment
- Proxi inversi
- Considerații HTTPS/TLS
- Verificări de sănătate ale aplicației (health checks)
- Oprire elegantă (graceful shutdown)
- Tratarea semnalelor de sistem de operare
- Scalarea aplicațiilor web Go
- Scalare orizontală versus verticală
- Troubleshooting de bază pentru deployment
- Practică hands-on: Implementarea aplicației web de exemplu
26. Capstone: Aplicație web Go completă
Participanții combină conceptele dezvoltând o aplicație completă.
Proiectul poate include:
- Inițializarea proiectului cu Go Modules
- Organizarea pachetelor
- Routing HTTP
- Endpoint-uri API REST
- Tratarea solicitărilor și răspunsurilor JSON
- Validarea input-ului
- Gestionarea erorilor
- Interfețe
- Procesare concurentă
- Comunicare cu API-uri externe
- Persistență de fișiere sau bază de date
- Testuri automate
- Logging
- Considerații de performanță
- Containerizare
- Configurarea de producție
- Deployment
27. Revizuire și bune practici
- Revizuirea sintaxei de bază Go
- Convenții de codare Go
- Scrierea de cod idiomatice în Go
- Menținerea codului simplu
- Design eficient al pachetelor
- Bunele practici de gestionare a erorilor
- Principii de design ale interfețelor
- Bunele practici de concurență
- Strategii de testare
- Considerații de performanță
- Menținabilitate și lizibilitate
- Erori comune ale dezvoltatorilor noi Go
- Aproach-uri recomandate pentru continuarea dezvoltării Go
28. Concluzii
- Revizuirea conceptelor cheie
- Revizuirea aplicației web finalizate
- Întrebări și discuții
- Troubleshooting scenarii comune din lumea reală
- Pasi următori recomandați pentru dezvoltarea Go
- Alte biblioteci Go și resurse din ecosistem
- Alte oportunități de construire a servicii Go de grad producție
Cerințe
- Înțelegerea principiilor generale de programare
Public țintă
- Dezvoltatori
Mărturii (5)
Formatorul a dovedit că este un expert în domeniu, ceea ce nu iau niciodată ca fiind cert. A oferit o perspectivă foarte utilă asupra standardelelor din industrie.
Giuseppe
Curs - Learning Go Programming
Tradus de catre o masina
M-a bucurat cantitatea de exerciții practice pe care am făcut-o. În mod personal, învaț prin practică, așa că a fost bine că Francesco a avut multe exerciții practice de realizat. Mi-am luptat cu câteva concepte prezentate în diapozitive, dar când am intrat în mod practic și am reușit să implementez unele dintre caracteristicile cheie ale limbajului, m-a ajutat să le înțeleg mai bine.
Adam Fitzhugh - OpticoreIT
Curs - Learning Go Programming
Tradus de catre o masina
pacea, abilitatea formatorului de a ajuta și de a menține ușor mai dificile întrebări.
Andrei Mihai - Viasat
Curs - Learning Go Programming
Tradus de catre o masina
Cunoașterea adâncă a lui Radu și ajustarea ritmului pentru mine.
Adeel Ahmad - Coefficient Data Ltd
Curs - Learning Go Programming
Tradus de catre o masina
Flexibilitatea instrucționarului. A adaptat cursul cu adevărat nevoilor noastre specifice.
Daniel Kurner - Daimler TSS
Curs - Learning Go Programming
Tradus de catre o masina