Schița de curs
1. Introducere în Go
- Ce este Go (Golang)?
- Istoricul și filozofia de design a Go
- Go ca limbaj de programare pentru web și sisteme
- Caracteristici cheie:
- Tipare statice
- Simplificare și lizibilitate
- Compilare rapidă
- Concurență integrată
- Culegerea de gunoi (Garbage Collection)
- Compilare cross-platform
- Cazuri de utilizare frecvente pentru Go
- Avantaje și limite ale Go
- Go comparat cu C/C++, JavaScript, Ruby, Python și Java
- Înțelegerea ecosistemului Go
- Prezentarea generală a bibliotecii standard Go
- Module Go și gestionarea dependențelor
- Anatomia unei aplicații Go
- Hands-on: Examinarea și rularea unui program Go simplu
2. Configurarea mediului de dezvoltare Go
- Instalarea Go
- Înțelegerea lanțului de unelte (toolchain) Go
- Configurarea variabilelor de mediu
- Alegerea unui IDE sau editor de cod
- Folosirea liniei de comandă cu Go
- Crearea unui workspace Go
- Înțelegerea structurii proiectului Go
- Inițializarea unui proiect cu Go Modules
- Folosirea
go mod init - Gestionarea dependențelor cu
go get - Actualizarea și inspectarea 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 a aplicațiilor
- Hands-on: Crearea și configurarea unui proiect Go într-un container
3. Variabile, constante și tipuri în Go
- Declarația variabilelor
- Tipuri explicite versus tipuri inferite
- Declarații scurte de variabile
- Constante
- Valori zero
- Domeniul și durata de viață a variabilelor
- Tipuri de date primitive:
- Numere întregi
- Numere cu virgulă mobilă
- Numere complexe
- Booleane
- Șiruri de caractere (Strings)
- Conversii de tip
- Lucrul cu Unicode și UTF-8
- Runes și bytes
- Alocarea multiplă a variabilelor
- Î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 atribuire
- Incrimentare și decrementare
- Precedența operatorilor
- Lucrul cu calculări cu numere întregi și cu virgulă mobilă
- Evitarea erorilor comune de conversie a tipurilor
- Exercițiu: Implementarea logicii de calculare și validare
5. Date, ore și formatare
- Folosirea pachetului
time - Crearea și manipularea datelor
- Obținerea orei curente
- Fusele orare și locațiile
- Parse-ul datelor și al orelor
- Formatarea datelor și a orelor
- Calcularea duratelor
- Lucrul cu timestamp-uri Unix
- Manageerea timeout-urilor
- Exercițiu: Adăugarea de timestamp-uri și calcule de durată într-o aplicație
6. Array-uri, Slices, Maps și Structuri
Array-uri
- Declarația array-urilor
- Inițializarea array-urilor
- Iterarea prin array-uri
- Array-uri multidimensionale
Slices
- Înțelegerea diferenței dintre slices și array-uri
- Crearea de slices
- Adăugarea elementelor
- Copierea slices
- Lungimea și capacitatea slices
- Slicing-ul slices
- Piulete (pitfalls) comune în slices
Maps
- Crearea de maps
- Adăugarea și ștergerea intrărilor
- Verificarea existenței unei chei
- Iterarea prin maps
- Maps care conțin date complexe
Structuri
-
Definirea structurilor
-
Câmpuri ale structurilor
-
Inițializarea structurilor
-
Structuri imbricate
-
Structuri anonime
-
Metode ale structurilor
-
Tag-uri JSON pentru structuri
-
Hands-on: Modelarea utilizatorilor, produselor și datelor aplicației folosind structuri, slices și maps
7. Logică condiționată și bucle
- Enunțuri
if elseșielse if- Declarația variabilelor în condiții
- Bucle
for - Bucle infinite
- Condițiile buclelor
breakșicontinue- Iterarea cu
range - Bucle imbricate
- Enunțuri
switch - Switch-uri bazate pe expresii
- Cazuri multiple
- Cazuri implicite (default)
- Type switches
- Exercițiu: Implementarea logicii de validare și procesare a aplicației
8. Funcții
- Definirea funcțiilor
- Parametrii funcțiilor
- Valori returnate
- Multiple valori returnate
- Valori returnate numite
- Funcții variadice
- Funcții anonime
- Valorile funcțiilor
- Closures
- Recursivitate
- Transmiterea 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. Pointeri și concepte de memorie
- Ce este un pointer?
- Operatorii de adresă și dereferențiere
- Pointeri și parametrii funcțiilor
- Receiveri pointeri
- Pointeri către structuri
- Pointeri nil
- Când să folosești pointeri
- Semantica de valoare versus semantica de referință
- Înțelegerea gestionării memoriei și culegerii de gunoi în Go
- Erori comune legate de pointeri
- Hands-on: Modificarea datelor aplicației folosind pointeri
10. Crearea unei aplicații web în Go
- Prezentarea generală a capabilităților web ale Go
- Introducere în pachetul
net/http - Crearea unui server HTTP
- Cereri și răspunsuri HTTP
- Metodele HTTP
- URL-uri de cerere și parametri de interogare
- Antete HTTP
- Coduri de stare HTTP
- Fundamente de rutare
- Crearea handler-elor
- Manageerea datelor de formular
- Servirea fișierelor statice
- Lucrul cu template-uri HTML
- Variabile template și structuri de control
- Structurarea unei aplicații web
- Hands-on: Construirea unui server web de bază în Go
11. Construirea unui serviciu web RESTful
- Fundamente arhitecturii REST
- Designul endpoint-urilor API
- GET, POST, PUT, PATCH și DELETE
- Lucrul cu JSON
- Encondarea și decodarea JSON
- Validarea cererilor
- Coduri de stare HTTP
- Răspunsuri cu erori
- Parametri de interogare și parametri de cale
- Structuri de răspuns API
- Separarea handler-elor de logica de business
- 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ă mediului
- Construirea pentru diferite sisteme de operare și arhitecturi
- Producerea binarelor autonome
- 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 directoarelor
- Metadatele fișierelor
- I/O tamponat (Buffered I/O)
- Lucrul cu fluxuri (streams)
- Citirea și scrierea fișierelor JSON
- Clienti HTTP
- Facerea de cereri HTTP în afara
- Manageerea erorilor clientului HTTP
- Timeout-uri și anulare
- Procesarea răspunsurilor API
- Hands-on: Recuperarea datelor dintr-un API extern și persistarea lor local
14. Gestionarea erorilor și depanare (Debugging)
- Abordarea Go pentru erori
- Returnarea erorilor din funcții
- Verificarea erorilor
- Crearea erorilor custom
- Învelirea erorilor (Wrapping errors)
- Adăugarea contextului la erori
errors.Isșierrors.As- Panic și recover
- Când să folosești
panic - Dezanarea problemelor comune în Go
- Logarea activității aplicației
- Folosirea uneltelor de debugging Go
- Exercițiu: Diagnosticarea și repararea erorilor introduce intenționat în aplicație
15. Interfețe și abstractizare
- Ce este o interfață?
- Implementarea implicită a interfețelor
- Definirea interfețelor
- Valorile interfețelor
- Interfețe goale /
any - Aserțiuni de tip
- Type switches
- Implementări cu pointer versus cu valoare
- Designul interfețelor mici
- Inversiunea dependențelor
- Utilizarea interfețelor pentru testing
- Reducerea cuplajului aplicației
- Hands-on: Introducerea interfețelor în aplicația web de exemplu
16. Pachete și organizarea proiectului
- Crearea de pachete
- Convenții de denumire a pachetelor
- Identificatori exportați și neexportați
- Importul de pachete
- Inițializarea pachetelor
- Organizarea stratului aplicației
- Pachete interne
- Gestionarea dependențelor cu Go Modules
- Versionarea semantică
- Utilizarea pachetelor de la terți
- Evitarea dependențelor circulare
- Designul proiectelor Go întreținabile
- Exercițiu: Refactorizarea aplicației în pachete separate
17. Concurență cu Goroutines
- Ce este concurența?
- Goroutines
- Startul goroutines
- Înțelegerea execuției concurente ușoare
- Provocări de sincronizare
- Stare partajată
- Condiții de cursă (Race conditions)
- Folosirea
sync.WaitGroup - Mutexuri și mutexuri de citire/scriere
- Operații atomice
- Hands-on: Conversia unei secvențiale într-o procesare concurentă
18. Canale (Channels)
- Înțelegerea canalelor
- Trimiterea și primirea valorilor
- Canale cu buffer versus fără buffer
- Comportament blocant (Blocking behavior)
- Închiderea canalelor
- Iterarea prin canale
- Canale direcționale
- Comunicare bazată pe canale
- Enunțuri Select
- Timeout-uri și anulare
- Modele Worker-pool
- Modele Producer/consumer
- Hands-on: Construirea unui sistem de lucru concurent
19. Context și gestionarea cererilor
- De ce sunt importante contextele în aplicațiile web
context.Context- Contextul pe cerere (Request-scoped context)
- Anulare
- Termene limite (Deadlines)
- Timeout-uri
- Propagarea contextului prin straturile aplicației
- Anularea operațiunilor de bază de date sau HTTP
- Evitarea utilizării incorecte a contextului
- Exercițiu: Adăugarea anulării cererilor și timeout-urilor în aplicația web
20. Testarea aplicațiilor Go
- De ce contează testele automatizate
- Scrierea testelor unitare
- Pachetul
testing - Funcții de test
- Convenții de denumire a testelor
- Teste bazate pe tabele (Table-driven tests)
- Testarea erorilor
- Testarea handler-elor HTTP
- Servicii de test HTTP
- Fixture-uri de test
- Copertura testelor
- Benchmark-uri
- Teste de exemplu
- Testarea interfețelor cu mocks sau fake
- Hands-on: Crearea unui suită de teste pentru aplicația de exemplu
21. Optimizarea performanței
- Înțelegerea performanței aplicațiilor Go
- Identificarea punctelor de blocare (bottlenecks)
- Performanță CPU versus memorie
- Structuri de date eficiente
- Reducerea alocațiilor inutile
- Șiruri de caractere, bytes și buffere
- Gestionarea goroutines
- Evitarea concurenței excesive
- Strategii de caching
- Considerații privind baza de date și rețeaua
- Profilarea aplicațiilor
- Benchmark-uri și testarea performanței
- Folosirea uneltelor de profilare Go
- Exercițiu: Profilarea și optimizarea unei aplicații deliberat ineficiente
22. Securitate și practici robuste pentru aplicații web
- Validarea intrărilor utilizatorului
- Manageerea sigură a cererilor HTTP
- Prevenirea vulnerabilităților web comune
- Gestionarea sigură a erorilor
- Concepte de autentificare și autorizare
- Manageerea secretelor și a configurației
- Comunicare HTTP securizată
- Evitarea informațiilor sensibile în loguri
- Gestionarea și actualizarea dependențelor
- Limite de resurse și timeout-uri de cerere
- Exercițiu: Revizuirea și întărirea securității API-ului de exemplu
23. Logarea aplicațiilor și observabilitatea
- Fundamentele logării
- Logare structurată
- Niveluri de log
- Logarea cererilor
- Logarea erorilor
- Corelarea și ID-uri de cerere
- Monitorizarea comportamentului aplicației
- Metrici de bază
- Endpoint-uri pentru verificări de sănătate (Health-check)
- Diagnosticarea problemelor de producție
- Hands-on: Adăugarea logării structurate și verificărilor de sănătate
24. Containerizarea aplicației Go
- De ce să folosești conteniere?
- Aplicații Go și containerizare
- Scrierea unui Dockerfile
- Build-uri în mai multe etape (Multi-stage builds)
- Construirea unei imagini de runtime minimale
- Manageerea configurației prin variabile de mediu
- Rețea în containere
- Expunerea porturilor aplicației
- Rularea aplicației într-un container
- Testarea aplicației containerizate
- Hands-on: Ambalarea aplicației Go de exemplu ca container gata de producție
25. Implementare (Deployment)
- Pregătirea aplicației pentru producție
- Construirea binarelor de producție
- Configurarea mediului
- Implementare bazată pe containere
- Arhitectura de implementare
- Proxii inverse
- Considerații HTTPS/TLS
- Verificări de sănătate ale aplicației
- Închidere grațioasă (Graceful shutdown)
- Gestionarea semnalelor sistemului de operare
- Scalarea aplicațiilor web Go
- Scalare orizontală versus verticală
- Troubleshooting de bază pentru implementare
- Hands-on: Implementarea aplicației web de exemplu
26. Proiect final (Capstone): Aplicație web completă în Go
Participanții combină conceptele dezvoltând o aplicație completă.
Proiectul poate include:
- Inițializarea proiectului cu Go Modules
- Organizarea pachetelor
- Rutare HTTP
- Endpoint-uri API REST
- Gestionarea cererilor și răspunsurilor JSON
- Validarea intrărilor
- Gestionarea erorilor
- Interfețe
- Procesare concurentă
- Comunicare cu API-uri externe
- Persistența datelor în fișiere sau bază de date
- Teste automatizate
- Logare
- Considerații de performanță
- Containerizare
- Configurare de producție
- Implementare (Deployment)
27. Revizuire și bune practici
- Revizuirea sintaxei de bază a Go
- Convenții de codificare Go
- Scrierea de cod idiomatice în Go
- Păstrarea codului simplu
- Design eficient al pachetelor
- Bune practici de gestionare a erorilor
- Principii de design al interfețelor
- Bune practici de concurență
- Strategii de testare
- Considerații de performanță
- Întreținere și lizibilitate
- Erori frecvente făcute de dezvoltatorii nobegin în Go
- Abordări recomandate pentru continuarea dezvoltării în Go
28. Concluzii
- Revizuirea conceptelor cheie
- Revizuirea aplicației web finalizate
- Întrebări și discuții
- Troubleshooting al scenariorilor reale comune
- Pași următori recomandați pentru dezvoltarea în Go
- Biblioteci suplimentare Go și resurse din ecosistem
- Perspective suplimentare pentru construcția de servicii Go de nivel de producție
Cerințe
- Înțelegerea principiilor generale de programare
Audiență
- 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