SlideShare a Scribd company logo
1 of 40
Download to read offline
Introduction à Go
Novembre 2016
Sylvain Wallez
Software Engineer, Elastic Cloud
Elastic.co
Au menu
A propos...
Origines de Go, qui l'utilise ?
Comparaison de Go et Java
Exemples
Programmation concurrente
La boîte à outils de Go
Adapté de "Go for Java Programmers(http://talks.golang.org/2015/go-for-java-programmers.slide)" de Sameer Ajmani
About me...
Origines de Go
"Go is an open source programming language that makes it easy to build simple, reliable,
and efficient software." -- golang.org(http://golang.org)
Créé par Google à partir de 2007 pour des besoins internes :
logiciels serveurs, architectures massivement distribuées (10⁶⁺ machines)
adapté à des grands projets (5000+ développeurs)
Open source depuis 2009 avec une communauté très active
Langage stable depuis la version 1 début 2012
Actuellement : Go 1.7.3
Les créateurs
Robert Griesemer : V8, Java HotSpot
Rob Pike : Unix team, créateur de UTF-8
Ken Thompson : inventeur du langage B, ancètre du C
Utilisations de Go chez Google
Des milliers de développeurs, des millions de lignes de code.
Exemples publics :
Proxy SPDY pour Chrome sur les mobiles
Serveur de téléchargement pour Chrome, ChromeOS, Android SDK, Earth, etc.
Load balancer Vitess pour MySQL (YouTube)
Kubernetes, orchestrateur de cluster Docker
La cible initiale est les services réseaux, mais c'est un langage généraliste.
Qui utilise Go ?
golang.org/wiki/GoUsers(http://golang.org/wiki/GoUsers)
Apcera, Bitbucket, bitly, Canonical, CloudFlare, Core OS, Digital Ocean, Docker, Dropbox,
Facebook, Getty Images, GitHub, Hashicorp, Heroku, InfluxDB, Iron.io, Kubernetes, Medium,
MongoDB services, Mozilla services, New York Times, pool.ntp.org, SmugMug, SoundCloud,
Stripe, Square, Thomson Reuters, Tumblr...
Qui utilise Go ?
OVH (job précédent):
- nouvelle génération de services internes
- outils de déploiement (Docker & co)
- Kafka as a Service, Time Series as a Service
Elastic (job actuel):
- les Beats, agents de collectes de métrique
Comparaison de Go et Java
Beaucoup de points communs
Descendance de C (langage impératif, accolades)
Typage statique
Garbage collected
Memory safe (références nulles, contrôle des bornes à l'exécution)
Les variables sont toujours initialisées (zero/nil/false)
Méthodes
Interfaces
Assertions sur les types (instanceof)
Reflection et introspection
Go est (évidemment) différent
Compilation en exécutable natif. Pas de VM
Link statique, exécutable autosuffisant
Contrôle sur l'organisation mémoire
Les fonctions sont des valeurs
String est un type primitif, représenté en UTF-8
Maps et array/slices : types primitifs
Goroutines et channels : concurrence définie dans le langage
Beaucoup d'omissions volontaires
Pas de classes (mais des interfaces)
Pas de constructeurs
Pas d'héritage (mais composition)
Pas de final
Pas d'exceptions
Pas de types génériques
Pourquoi Go fait ces omissions ?
Volonté des créateurs du langage :
La clarté du code est primordiale.
En lisant du code, comprendre ce qu'il fait doit être clair immédiatement.
En écrivant du code, savoir comment l'écrire doit être clair immédiatement.
Un peu de redondance vaut parfois mieux qu'une factorisation obscure.
Pour plus d'infos :
Less is exponentially more (Pike, 2012)(http://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html)
Go at Google: Language Design in the Service of Software Engineering (Pike, 2012)
(http://talks.golang.org/2012/splash.article)
Exemples
Go, une syntaxe familière quand on vient de C ou Java
Main.java
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
} Run
Hello, web server
Les types viennent après les noms.
Les noms Capitalisés sont publics. Les autres noms sont privés (package).
Il y a des types pointeurs.
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/hello", handleHello)
fmt.Println("serving on http://localhost:7777/hello")
log.Fatal(http.ListenAndServe("localhost:7777", nil))
}
func handleHello(w http.ResponseWriter, req *http.Request) {
log.Println("serving", req.URL)
fmt.Fprintln(w, "Hello, world!")
} Run
Exemple : recherche sur Google
func main() {
http.HandleFunc("/search", handleSearch)
fmt.Println("serving on http://localhost:8080/search")
log.Fatal(http.ListenAndServe("localhost:8080", nil))
}
// handleSearch handles URLs like "/search?q=golang" by running a
// Google search for "golang" and writing the results as HTML to w.
func handleSearch(w http.ResponseWriter, req *http.Request) { Run
Valider la requête
func handleSearch(w http.ResponseWriter, req *http.Request) {
log.Println("serving", req.URL)
// Check the search query.
query := req.FormValue("q")
if query == "" {
http.Error(w, `missing "q" URL parameter`, http.StatusBadRequest)
return
}
query := req.FormValue("q") initialise une nouvelle variable query du type de
l'expression (string).
FormValue est une méthode sur le type *http.Request :
package http
type Request struct {...}
func (r *Request) FormValue(key string) string {...}
Collecter les résultats
// Run the Google search.
start := time.Now()
results, err := Search(query)
elapsed := time.Since(start)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
Search renvoie 2 valeurs : une "slice" de résultats, et une erreur.
func Search(query string) ([]Result, error) {...}
Les résultats sont valides uniquement si l'erreur est nil
type error interface {
Error() string // a useful human-readable error message
}
Les erreurs peuvent contenir des infos complémentaires, accessibles via des cast ("type
assertion").
Afficher les résultats
// Render the results.
type templateData struct {
Results []Result
Elapsed time.Duration
}
err = resultsTemplate.Execute(w, templateData{
Results: results,
Elapsed: elapsed,
});
if err != nil {
log.Print(err)
return
}
resultsTemplate.Execute produit du HTML et l'écrit dans un io.Writer :
type Writer interface {
Write(p []byte) (n int, err error)
}
http.ResponseWriter implémente l'interface io.Writer.
Les templates HTML
Dans librairie standard, similaire à Mustache
Paramètres : maps et objets Go
// A Result contains the title and URL of a search result.
type Result struct {
Title, URL string
}
var resultsTemplate = template.Must(template.New("results").Parse(`
<html>
<head/>
<body>
<ol>
{{range .Results}}
<li>{{.Title}} - <a href="{{.URL}}">{{.URL}}</a></li>
{{end}}
</ol>
<p>{{len .Results}} results in {{.Elapsed}}</p>
</body>
</html>
`)) Run
Envoyer une requête à l'API Google Search
func Search(query string) ([]Result, error) {
// Prepare the Google Search API request.
u, err := url.Parse("https://ajax.googleapis.com/ajax/services/search/web?v=1.0")
if err != nil {
return nil, err
}
q := u.Query()
q.Set("q", query)
u.RawQuery = q.Encode()
// Issue the HTTP request and handle the response.
resp, err := http.Get(u.String())
if err != nil {
return nil, err
}
defer resp.Body.Close()
L'instruction defer resp.Body.Close est équivalente au finally Java
Parser la réponse JSON dans une structure Go
// https://developers.google.com/web-search/docs/#fonje
var jsonResponse struct { // anonymous structure
ResponseData struct {
Results []struct {
TitleNoFormatting, URL string
}
}
}
if err := json.NewDecoder(resp.Body).Decode(&jsonResponse); err != nil {
return nil, err
}
// Extract the Results from jsonResponse and return them.
var results []Result
for _, r := range jsonResponse.ResponseData.Results {
results = append(results, Result{Title: r.TitleNoFormatting, URL: r.URL})
}
return results, nil
}
Terminé pour le front-end !
Nous n'avons utilisé que la librairie standard :
import (
"encoding/json"
"fmt"
"html/template"
"log"
"net/http"
"net/url"
"time"
)
Les serveurs Go tiennent la charge : chaque requête tourne dans une goroutine séparée.
Goroutine ?
L'exécution concurrente en Go
Communicating Sequential Processes (Tony Hoare, 1978)
Les programmes concurrents sont structurés en :
processus indépendants
qui s'exécutent séquentiellement
et communiquent en échangeant des messages.
L'exécution séquentielle est facile à comprendre. Pas les callbacks !
Les primitives Go : goroutines, channels, et l'instruction select.
Goroutines
Les goroutines sont comme des threads légers.
Elles démarrent avec des petites piles (stack) qui sont retaillées selon les besoins.
Un programme Go peut avoir des milliers de goroutines actives.
On démarre une goroutine avec l'instruction go :
doSomething()
go doSomethingElse(arg1, arg2) // Forked in a separate goroutine
doAnotherThing()
Le runtime Go ordonnance les goroutines sur des threads de l'OS
Une goroutine bloquée ne bloque pas un thread !
Channels
Le canal de communication entre les goroutines.
c := make(chan string)
// goroutine 1
go func() {
c <- "hello!"
}()
// goroutine 2
go func() {
s := <-c
fmt.Println(s) // "hello!"
}()
Select
Un select bloque jusqu'à ce que envoi ou réception soient possibles.
select {
case n := <-in:
fmt.Println("received", n)
case out <- v:
fmt.Println("sent", v)
}
Le default permet de ne pas bloquer.
select {
case out <- v:
fmt.Println("sent", v)
default:
fmt.Println("No message, moving on")
}
Exemple : Recherche Google (côté serveur)
A partir de mots-clés, renvoyer une page de résultats :
faire une recherche sur le Web
faire une recherche sur Youtube
faire une recherche sur Google Maps
faire une recherche dans les News, etc
sélectionner des pubs (faut bien vivre !)
assembler les résultats (et les pubs)
Un Google fake en 6 lignes
On simule une recherche par un délai aléatoire de 100 ms maximum.
var (
Web = fakeSearch("web")
Image = fakeSearch("image")
Video = fakeSearch("video")
// ... other sources
)
type Result string
type Search func(query string) Result
func fakeSearch(kind string) Search {
return func(query string) Result {
time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
return Result(fmt.Sprintf("%s result for %qn", kind, query))
}
}
fakeSearch est une fonction qui retourne une fonction
Google Search : le main()
func main() {
start := time.Now()
results := GoogleSearch("golang")
elapsed := time.Since(start)
fmt.Println(results)
fmt.Println(elapsed)
} Run
Google Search (séquentiel)
La fonction GoogleSearch prend une chaîne de recherche, et renvoie une slice de Results
(des string).
Lance sequentiellement les recherches Web, Image, et Video, et ajoute leurs résultats à la
slice de résultats.
Temps total = somme des temps individuels
func GoogleSearch(query string) (results []Result) {
results = append(results, Web(query))
results = append(results, Image(query))
results = append(results, Video(query))
return
} Run
Google Search (parallèle)
On lance les recherches en parallèle, et on attend tous les résultats.
Les func anonymes sont des closures sur query and c.
Temps total = temps de la requête la plus longue
func Google(query string) (results []Result) {
c := make(chan Result)
go func() { c <- Web(query) }()
go func() { c <- Image(query) }()
go func() { c <- Video(query) }()
for i := 0; i < 3; i++ {
result := <-c
results = append(results, result)
}
return
} Run
Google Search (parallèle + timeout)
On n'attend pas les serveurs qui traînent.
Pas de lock, pas de synchronized, pas de callbacks !
c := make(chan Result, 3)
go func() { c <- Web(query) }()
go func() { c <- Image(query) }()
go func() { c <- Video(query) }()
timeout := time.After(80 * time.Millisecond)
for i := 0; i < 3; i++ {
select {
case result := <-c:
results = append(results, result)
case <-timeout:
fmt.Println("timed out")
return
}
}
return Run
Les outils
Go : l'outillage
La commande 'go' :
go fmt(http://play.golang.org/p/GPqra77cBK): formatage selon les règles canoniques
go vet : "checkstyle" par les devs de Go
go doc : javadoc-like. Tout le Go open source sur godoc.org(http://godoc.org)
go get : téléchargement/installation de packages
IDE : plugins IntelliJ, Eclipse, Sublime, Vim...
Compilation cross-platform (Yay Raspberry Pi !)
Compilation pour mobiles (applis ou librairies Android et iOS)
Quelques liens
Tutoriel interactif
tour.golang.org(http://tour.golang.org)
Effective Go : un must read pour aller plus loin
golang.org/doc/effective_go.html(https://golang.org/doc/effective_go.html)
Collection de liens, de trucs et astuces, etc.
golang.org/wiki/Learn(http://golang.org/wiki/Learn)
Cette présentation
github.com/swallez/golang-talks/(https://github.com/swallez/golang-talks/)
Thank you
Sylvain Wallez
Software Engineer, Elastic Cloud
Elastic.co
@bluxte(http://twitter.com/bluxte)
sylvain@bluxte.net(mailto:sylvain@bluxte.net)
Introduction au langage Go

More Related Content

What's hot

Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
Cassandra Spark Lan Party at Devoxx France
Cassandra Spark Lan Party at Devoxx FranceCassandra Spark Lan Party at Devoxx France
Cassandra Spark Lan Party at Devoxx FranceJérémy Sevellec
 
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchParis Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchMourad DACHRAOUI
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Jean-Michel Doudoux
 
Votre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prodVotre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prodCéline Louvet
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Julien Jakubowski
 
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015Modern Data Stack France
 
Présentation JavaScript
Présentation JavaScriptPrésentation JavaScript
Présentation JavaScripttarkan_
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejsnaholyr
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express jsAbdoulaye Dieng
 
Perfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramePerfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramebleporini
 
EBIZNEXT-RIAK
EBIZNEXT-RIAKEBIZNEXT-RIAK
EBIZNEXT-RIAKebiznext
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API RESTAbdoulaye Dieng
 

What's hot (20)

La programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PFLa programmation fonctionnelle en javascript / PF
La programmation fonctionnelle en javascript / PF
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
Django by mrjmad
Django by mrjmadDjango by mrjmad
Django by mrjmad
 
Cassandra Spark Lan Party at Devoxx France
Cassandra Spark Lan Party at Devoxx FranceCassandra Spark Lan Party at Devoxx France
Cassandra Spark Lan Party at Devoxx France
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchParis Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8
 
Votre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prodVotre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prod
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
Apache Flink par Bilal Baltagi Paris Spark Meetup Dec 2015
 
Présentation JavaScript
Présentation JavaScriptPrésentation JavaScript
Présentation JavaScript
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 
Dynamic Languages
Dynamic LanguagesDynamic Languages
Dynamic Languages
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
The Future of Javascript
The Future of JavascriptThe Future of Javascript
The Future of Javascript
 
Perfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui ramePerfug Guide de survie du développeur dans une application Java qui rame
Perfug Guide de survie du développeur dans une application Java qui rame
 
EBIZNEXT-RIAK
EBIZNEXT-RIAKEBIZNEXT-RIAK
EBIZNEXT-RIAK
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API REST
 

Similar to Introduction au langage Go

Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBruno Bonnin
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en goAbdoul Kader Sarambe
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Yannick Chartois
 
Geek Time Janvier 2017 : Java 8
Geek Time Janvier 2017 : Java 8Geek Time Janvier 2017 : Java 8
Geek Time Janvier 2017 : Java 8OLBATI
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
ENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: GroovyENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: GroovyHoracio Gonzalez
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewOSInet
 
Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)Novelys
 

Similar to Introduction au langage Go (20)

Go
GoGo
Go
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Drools
DroolsDrools
Drools
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8
 
Drools et les moteurs de règles
Drools et les moteurs de règlesDrools et les moteurs de règles
Drools et les moteurs de règles
 
Geek Time Janvier 2017 : Java 8
Geek Time Janvier 2017 : Java 8Geek Time Janvier 2017 : Java 8
Geek Time Janvier 2017 : Java 8
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
ENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: GroovyENIB 2013-2014 - CAI Web #3: Groovy
ENIB 2013-2014 - CAI Web #3: Groovy
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TView
 
Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)Séminaire Ruby on Rails (novembre 2010)
Séminaire Ruby on Rails (novembre 2010)
 

More from Sylvain Wallez

Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVMSylvain Wallez
 
Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGSylvain Wallez
 
Developing web applications in Rust
Developing web applications in RustDeveloping web applications in Rust
Developing web applications in RustSylvain Wallez
 
Black friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchBlack friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchSylvain Wallez
 
Elastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamElastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamSylvain Wallez
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Sylvain Wallez
 
Kibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackKibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackSylvain Wallez
 
2016 05 iot - apero web
2016 05 iot - apero web2016 05 iot - apero web
2016 05 iot - apero webSylvain Wallez
 
Brown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastBrown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastSylvain Wallez
 
Lucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiquesLucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiquesSylvain Wallez
 
2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open HardwareSylvain Wallez
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Sylvain Wallez
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro EditionSylvain Wallez
 

More from Sylvain Wallez (13)

Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVM
 
Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUG
 
Developing web applications in Rust
Developing web applications in RustDeveloping web applications in Rust
Developing web applications in Rust
 
Black friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchBlack friday logs - Scaling Elasticsearch
Black friday logs - Scaling Elasticsearch
 
Elastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamElastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering team
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!
 
Kibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackKibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stack
 
2016 05 iot - apero web
2016 05 iot - apero web2016 05 iot - apero web
2016 05 iot - apero web
 
Brown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastBrown Bag Lunch sur Hazelcast
Brown Bag Lunch sur Hazelcast
 
Lucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiquesLucene - 10 ans d'usages plus ou moins classiques
Lucene - 10 ans d'usages plus ou moins classiques
 
2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro Edition
 

Introduction au langage Go

  • 1. Introduction à Go Novembre 2016 Sylvain Wallez Software Engineer, Elastic Cloud Elastic.co
  • 2. Au menu A propos... Origines de Go, qui l'utilise ? Comparaison de Go et Java Exemples Programmation concurrente La boîte à outils de Go Adapté de "Go for Java Programmers(http://talks.golang.org/2015/go-for-java-programmers.slide)" de Sameer Ajmani
  • 4. Origines de Go "Go is an open source programming language that makes it easy to build simple, reliable, and efficient software." -- golang.org(http://golang.org) Créé par Google à partir de 2007 pour des besoins internes : logiciels serveurs, architectures massivement distribuées (10⁶⁺ machines) adapté à des grands projets (5000+ développeurs) Open source depuis 2009 avec une communauté très active Langage stable depuis la version 1 début 2012 Actuellement : Go 1.7.3
  • 5. Les créateurs Robert Griesemer : V8, Java HotSpot Rob Pike : Unix team, créateur de UTF-8 Ken Thompson : inventeur du langage B, ancètre du C
  • 6. Utilisations de Go chez Google Des milliers de développeurs, des millions de lignes de code. Exemples publics : Proxy SPDY pour Chrome sur les mobiles Serveur de téléchargement pour Chrome, ChromeOS, Android SDK, Earth, etc. Load balancer Vitess pour MySQL (YouTube) Kubernetes, orchestrateur de cluster Docker La cible initiale est les services réseaux, mais c'est un langage généraliste.
  • 7. Qui utilise Go ? golang.org/wiki/GoUsers(http://golang.org/wiki/GoUsers) Apcera, Bitbucket, bitly, Canonical, CloudFlare, Core OS, Digital Ocean, Docker, Dropbox, Facebook, Getty Images, GitHub, Hashicorp, Heroku, InfluxDB, Iron.io, Kubernetes, Medium, MongoDB services, Mozilla services, New York Times, pool.ntp.org, SmugMug, SoundCloud, Stripe, Square, Thomson Reuters, Tumblr...
  • 8. Qui utilise Go ? OVH (job précédent): - nouvelle génération de services internes - outils de déploiement (Docker & co) - Kafka as a Service, Time Series as a Service Elastic (job actuel): - les Beats, agents de collectes de métrique
  • 10. Beaucoup de points communs Descendance de C (langage impératif, accolades) Typage statique Garbage collected Memory safe (références nulles, contrôle des bornes à l'exécution) Les variables sont toujours initialisées (zero/nil/false) Méthodes Interfaces Assertions sur les types (instanceof) Reflection et introspection
  • 11. Go est (évidemment) différent Compilation en exécutable natif. Pas de VM Link statique, exécutable autosuffisant Contrôle sur l'organisation mémoire Les fonctions sont des valeurs String est un type primitif, représenté en UTF-8 Maps et array/slices : types primitifs Goroutines et channels : concurrence définie dans le langage
  • 12. Beaucoup d'omissions volontaires Pas de classes (mais des interfaces) Pas de constructeurs Pas d'héritage (mais composition) Pas de final Pas d'exceptions Pas de types génériques
  • 13. Pourquoi Go fait ces omissions ? Volonté des créateurs du langage : La clarté du code est primordiale. En lisant du code, comprendre ce qu'il fait doit être clair immédiatement. En écrivant du code, savoir comment l'écrire doit être clair immédiatement. Un peu de redondance vaut parfois mieux qu'une factorisation obscure. Pour plus d'infos : Less is exponentially more (Pike, 2012)(http://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html) Go at Google: Language Design in the Service of Software Engineering (Pike, 2012) (http://talks.golang.org/2012/splash.article)
  • 15. Go, une syntaxe familière quand on vient de C ou Java Main.java public class Main { public static void main(String[] args) { System.out.println("Hello, world!"); } } hello.go package main import "fmt" func main() { fmt.Println("Hello, world!") } Run
  • 16. Hello, web server Les types viennent après les noms. Les noms Capitalisés sont publics. Les autres noms sont privés (package). Il y a des types pointeurs. package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/hello", handleHello) fmt.Println("serving on http://localhost:7777/hello") log.Fatal(http.ListenAndServe("localhost:7777", nil)) } func handleHello(w http.ResponseWriter, req *http.Request) { log.Println("serving", req.URL) fmt.Fprintln(w, "Hello, world!") } Run
  • 17. Exemple : recherche sur Google func main() { http.HandleFunc("/search", handleSearch) fmt.Println("serving on http://localhost:8080/search") log.Fatal(http.ListenAndServe("localhost:8080", nil)) } // handleSearch handles URLs like "/search?q=golang" by running a // Google search for "golang" and writing the results as HTML to w. func handleSearch(w http.ResponseWriter, req *http.Request) { Run
  • 18. Valider la requête func handleSearch(w http.ResponseWriter, req *http.Request) { log.Println("serving", req.URL) // Check the search query. query := req.FormValue("q") if query == "" { http.Error(w, `missing "q" URL parameter`, http.StatusBadRequest) return } query := req.FormValue("q") initialise une nouvelle variable query du type de l'expression (string). FormValue est une méthode sur le type *http.Request : package http type Request struct {...} func (r *Request) FormValue(key string) string {...}
  • 19. Collecter les résultats // Run the Google search. start := time.Now() results, err := Search(query) elapsed := time.Since(start) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } Search renvoie 2 valeurs : une "slice" de résultats, et une erreur. func Search(query string) ([]Result, error) {...} Les résultats sont valides uniquement si l'erreur est nil type error interface { Error() string // a useful human-readable error message } Les erreurs peuvent contenir des infos complémentaires, accessibles via des cast ("type assertion").
  • 20. Afficher les résultats // Render the results. type templateData struct { Results []Result Elapsed time.Duration } err = resultsTemplate.Execute(w, templateData{ Results: results, Elapsed: elapsed, }); if err != nil { log.Print(err) return } resultsTemplate.Execute produit du HTML et l'écrit dans un io.Writer : type Writer interface { Write(p []byte) (n int, err error) } http.ResponseWriter implémente l'interface io.Writer.
  • 21. Les templates HTML Dans librairie standard, similaire à Mustache Paramètres : maps et objets Go // A Result contains the title and URL of a search result. type Result struct { Title, URL string } var resultsTemplate = template.Must(template.New("results").Parse(` <html> <head/> <body> <ol> {{range .Results}} <li>{{.Title}} - <a href="{{.URL}}">{{.URL}}</a></li> {{end}} </ol> <p>{{len .Results}} results in {{.Elapsed}}</p> </body> </html> `)) Run
  • 22. Envoyer une requête à l'API Google Search func Search(query string) ([]Result, error) { // Prepare the Google Search API request. u, err := url.Parse("https://ajax.googleapis.com/ajax/services/search/web?v=1.0") if err != nil { return nil, err } q := u.Query() q.Set("q", query) u.RawQuery = q.Encode() // Issue the HTTP request and handle the response. resp, err := http.Get(u.String()) if err != nil { return nil, err } defer resp.Body.Close() L'instruction defer resp.Body.Close est équivalente au finally Java
  • 23. Parser la réponse JSON dans une structure Go // https://developers.google.com/web-search/docs/#fonje var jsonResponse struct { // anonymous structure ResponseData struct { Results []struct { TitleNoFormatting, URL string } } } if err := json.NewDecoder(resp.Body).Decode(&jsonResponse); err != nil { return nil, err } // Extract the Results from jsonResponse and return them. var results []Result for _, r := range jsonResponse.ResponseData.Results { results = append(results, Result{Title: r.TitleNoFormatting, URL: r.URL}) } return results, nil }
  • 24. Terminé pour le front-end ! Nous n'avons utilisé que la librairie standard : import ( "encoding/json" "fmt" "html/template" "log" "net/http" "net/url" "time" ) Les serveurs Go tiennent la charge : chaque requête tourne dans une goroutine séparée. Goroutine ?
  • 26. Communicating Sequential Processes (Tony Hoare, 1978) Les programmes concurrents sont structurés en : processus indépendants qui s'exécutent séquentiellement et communiquent en échangeant des messages. L'exécution séquentielle est facile à comprendre. Pas les callbacks ! Les primitives Go : goroutines, channels, et l'instruction select.
  • 27. Goroutines Les goroutines sont comme des threads légers. Elles démarrent avec des petites piles (stack) qui sont retaillées selon les besoins. Un programme Go peut avoir des milliers de goroutines actives. On démarre une goroutine avec l'instruction go : doSomething() go doSomethingElse(arg1, arg2) // Forked in a separate goroutine doAnotherThing() Le runtime Go ordonnance les goroutines sur des threads de l'OS Une goroutine bloquée ne bloque pas un thread !
  • 28. Channels Le canal de communication entre les goroutines. c := make(chan string) // goroutine 1 go func() { c <- "hello!" }() // goroutine 2 go func() { s := <-c fmt.Println(s) // "hello!" }()
  • 29. Select Un select bloque jusqu'à ce que envoi ou réception soient possibles. select { case n := <-in: fmt.Println("received", n) case out <- v: fmt.Println("sent", v) } Le default permet de ne pas bloquer. select { case out <- v: fmt.Println("sent", v) default: fmt.Println("No message, moving on") }
  • 30. Exemple : Recherche Google (côté serveur) A partir de mots-clés, renvoyer une page de résultats : faire une recherche sur le Web faire une recherche sur Youtube faire une recherche sur Google Maps faire une recherche dans les News, etc sélectionner des pubs (faut bien vivre !) assembler les résultats (et les pubs)
  • 31. Un Google fake en 6 lignes On simule une recherche par un délai aléatoire de 100 ms maximum. var ( Web = fakeSearch("web") Image = fakeSearch("image") Video = fakeSearch("video") // ... other sources ) type Result string type Search func(query string) Result func fakeSearch(kind string) Search { return func(query string) Result { time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) return Result(fmt.Sprintf("%s result for %qn", kind, query)) } } fakeSearch est une fonction qui retourne une fonction
  • 32. Google Search : le main() func main() { start := time.Now() results := GoogleSearch("golang") elapsed := time.Since(start) fmt.Println(results) fmt.Println(elapsed) } Run
  • 33. Google Search (séquentiel) La fonction GoogleSearch prend une chaîne de recherche, et renvoie une slice de Results (des string). Lance sequentiellement les recherches Web, Image, et Video, et ajoute leurs résultats à la slice de résultats. Temps total = somme des temps individuels func GoogleSearch(query string) (results []Result) { results = append(results, Web(query)) results = append(results, Image(query)) results = append(results, Video(query)) return } Run
  • 34. Google Search (parallèle) On lance les recherches en parallèle, et on attend tous les résultats. Les func anonymes sont des closures sur query and c. Temps total = temps de la requête la plus longue func Google(query string) (results []Result) { c := make(chan Result) go func() { c <- Web(query) }() go func() { c <- Image(query) }() go func() { c <- Video(query) }() for i := 0; i < 3; i++ { result := <-c results = append(results, result) } return } Run
  • 35. Google Search (parallèle + timeout) On n'attend pas les serveurs qui traînent. Pas de lock, pas de synchronized, pas de callbacks ! c := make(chan Result, 3) go func() { c <- Web(query) }() go func() { c <- Image(query) }() go func() { c <- Video(query) }() timeout := time.After(80 * time.Millisecond) for i := 0; i < 3; i++ { select { case result := <-c: results = append(results, result) case <-timeout: fmt.Println("timed out") return } } return Run
  • 37. Go : l'outillage La commande 'go' : go fmt(http://play.golang.org/p/GPqra77cBK): formatage selon les règles canoniques go vet : "checkstyle" par les devs de Go go doc : javadoc-like. Tout le Go open source sur godoc.org(http://godoc.org) go get : téléchargement/installation de packages IDE : plugins IntelliJ, Eclipse, Sublime, Vim... Compilation cross-platform (Yay Raspberry Pi !) Compilation pour mobiles (applis ou librairies Android et iOS)
  • 38. Quelques liens Tutoriel interactif tour.golang.org(http://tour.golang.org) Effective Go : un must read pour aller plus loin golang.org/doc/effective_go.html(https://golang.org/doc/effective_go.html) Collection de liens, de trucs et astuces, etc. golang.org/wiki/Learn(http://golang.org/wiki/Learn) Cette présentation github.com/swallez/golang-talks/(https://github.com/swallez/golang-talks/)
  • 39. Thank you Sylvain Wallez Software Engineer, Elastic Cloud Elastic.co @bluxte(http://twitter.com/bluxte) sylvain@bluxte.net(mailto:sylvain@bluxte.net)