2. Cos’è Golang?
"Go is an open source programming language that makes it easy
to build simple, reliable, and efficient software."
(cit. golang.org)
La prima versione stabile, Go 1 è stata rilasciata nel 2012
Rilasciato nel 2009 con licenza open source da Google
3. Perché è nato Go?
Go è stato sviluppato per risolvere i problemi di scalabilità di Google
• scalare su un enorme numero di server
• i job giornalieri devono girare su migliaia di macchine
• i job devono coordinarsi tra loro
• un sacco di cose da fare tutte insieme
La soluzione? Un grande supporto per la concorrenza
4. Golang
Per cosa viene usato Go a Google???
Alcuni esempi:
• SPDY proxy for Chrome on mobile devices
• Download server for Chrome, ChromeOS, Android SDK, Earth, etc.
• YouTube Vitess MySQL balancer
Viene usato principalmente per applicativi server, ma è un linguaggio general purpose
Ma non solo Google, Go è usato anche da:
Apcera, Bitbucket, bitly, Canonical, CloudFlare, Core OS, Digital Ocean, Docker, Dropbox, Facebook,
Getty Images, GitHub, Heroku, Iron.io, Kubernetes, Medium, MongoDB services,
Mozilla services, New York Times, pool.ntp.org, Secret, SmugMug, SoundCloud,
Stripe, Square, Thomson Reuters, Tumblr, ...
golang.org/wiki/GoUsers
5. Golang
Vediamo adesso alcune differenze tra Go e Java
Cosa hanno in comune??? (molto a dire il vero)
• C family (imperative, braces)
• Statically typed
• Garbage collected
• Memory safe (nil references, runtime bounds checks)
• Variables are always initialized (zero/nil/false)
• Methods
• Interfaces
• Type assertions (instanceof)
• Reflection
6. Golang
Vediamo adesso alcune differenze tra Go e Java
E invece in cosa differiscono?(anche qui ci sono molte differenze)
• Programs compile to machine code. There's no VM.
• Statically linked binaries
• Control over memory layout
• Function values and lexical closures
• Built-in strings (UTF-8)
• Built-in generic maps and arrays/slices
• Built-in concurrency
7. Golang
Vediamo adesso alcune differenze tra Go e Java
“Stranezze” del Go:
• No classes
• No constructors
• No inheritance
• No final
• No exceptions
• No annotations
• No user-defined generics
E un compilatore abbastanza “nevrotico”
8. Golang
Perché si è deciso di tagliare queste caratteristiche?
La parola chiave è chiarezza
Quando leggi del codice devi subito capire cosa fa
Quando scrivi del codice devi capire come far fare al programma ciò che
vuoi
Link utili sul design di Golang
• Less is exponentially more (Pike, 2012)
• Go at Google: Language Design in the Service of Software Engineering (Pike, 2012)
10. Golang
Abbiamo detto che Go nasce con la concorrenza in mente
Vediamo cosa mette a disposizione:
• goroutines
• channels
• il costrutto select
11. Golang
Goroutines
Thread leggeri che si adattano durante la loro esecuzione
si lanciano con:
La runtime di Go li schedula dentro i thread dell’OS
go f(args)
12. Golang
Channles
Permettono la creazione di un canale di comunicazione tra le
goroutines
c := make(chan string)
// goroutine 1
c <- "hello!”
// goroutine 2
s := <-c
fmt.Println(s) // "hello!"
14. Golang
Organizzazione del workspace
Il compilatore Go è nato per lavorare su repository e quindi predilige un organizzazione gerarchica
del workspace
in particolare
• src sorgenti Go organizzati per package (ogni package ha la sua directory)
• pkg contiene I file oggetto dei package
• bin contitene gli eseguibili
15. Golang
Il package http
Il package http, fornisce gli strumenti gestire le richieste http
è intrinsecamente concorrente