class: center, middle # Let's Go --- ## [Go turns 10!](https://blog.golang.org/10years)
--- class: center, middle # Why should I choose Go? ??? - Qui n'a jamais entendu parlé du langage Go ? - Qui a déjà codé quelque chose en Go ? --- ## What is Go? > Go is a compiled, concurrent, garbage-collected, statically typed language developed at Google. > > It is an open source project. Rob Pike - https://talks.golang.org/2012/splash.article ??? - Go est connu pour faciliter le traitement concurrent - Go est connu pour être utilisé dans de gros projets cloud (docker, k8s, etcd, vault) --- class: center, middle ## Go + concurrent programming = <3 --- ## Go has been created to ease software engineering > Software engineering is what happens to programming > when you add time and other programmers. Russ Cox - https://research.swtch.com/vgo-eng > Go is a programming language designed by Google to help solve Google's problems, > and Google has big problems. > [...] > The language was designed by and for people who write—and read and debug and > maintain—large software systems. Rob Pike - https://talks.golang.org/2012/splash.article --- ```go package ghibli import ( "encoding/json" "fmt" "net/http" ) // Film represents a film produced by the Ghibli studio. type Film struct { Title string `json:"title"` Year string `json:"release_date"` } // GetFilms requests the HTTP API to return all the films // produced by the Ghibli studio. func GetFilms() ([]Film, error) { resp, err := http.Get("https://ghibliapi.herokuapp.com/films") if err != nil { return nil, fmt.Errorf("http err: %v", err) } defer resp.Body.Close() var films []Film decoder := json.NewDecoder(resp.Body) if err := decoder.Decode(&films); err != nil { return nil, fmt.Errorf("json decode err: %v", err) } return films, nil } ``` ??? Go a été designé dans le but d'être meilleur ça: - le formatage est obligatoire et inclu, c'est pas forcément "le meilleur" mais il n'y en a qu'un - pas de discussions sur le format à suivre  - facilité de lecture quelle que soit l'origine du code : projet, dépendance, core - **un code formatté facilite la création d'outils** - goimports - go vet - go error check - gorename - go fix --- ```go package main import ( "fmt" "git.blueboard.io/pierre/lab/demo/ghibli" ) func main() { films, err := ghibli.GetFilms() if err != nil { panic(err) } for _, f := range films { fmt.Printf("%s\t%s\n", f.Year, f.Title) } } ``` ```sh $ ./demo 1986 Castle in the Sky 1988 Grave of the Fireflies 1988 My Neighbor Totoro 1989 Kiki's Delivery Service 1991 Only Yesterday 1992 Porco Rosso 1994 Pom Poko 1995 Whisper of the Heart 1997 Princess Mononoke 1999 My Neighbors the Yamadas 2001 Spirited Away 2002 The Cat Returns 2004 Howl's Moving Castle 2006 Tales from Earthsea 2008 Ponyo 2010 Arrietty 2011 From Up on Poppy Hill 2013 The Wind Rises 2013 The Tale of the Princess Kaguya 2014 When Marnie Was There ``` ??? - imports are urls - lorsque vous lisez un fichier go, toutes ses dépendances sont déclarées dans un statement `import` au debut du fichier - l'utilisation d'urls enlève toute ambiguité sur la source de la dépendance - facilite l'accès à ce code source --- ## Go is easy to install ```sh function golang_upgrade { if ! [ -n "$1" ]; then echo 'you need to specify a version' return 1 fi curl -L -o /tmp/golang.tar.gz https://dl.google.com/go/go${1}.linux-amd64.tar.gz && \ sudo rm -fr /usr/local/go && \ sudo tar -C /usr/local -xzf /tmp/golang.tar.gz && \ rm /tmp/golang.tar.gz && \ go version } ``` ??? Ça fonctionne pour linux, windows, osx, freebsd sur arm, amd64, 386 --- ## Go is easy to learn > Some programmers find it fun to work in; others find it unimaginative, even boring. Rob Pike - https://talks.golang.org/2012/splash.article ??? - C family - beaucoup d'articles dans le blog officiel et parmis la core team extrèment précis, complets et bien rédigés - le blog est une mine d'or - plusieurs livres qui font référence dans le langage - le tour de Go - doc inclue et cohérente (à la javadoc) - la "marche" est beaucoup moins haute que pour d'autres langages récents (Rust, fonctionnels, etc...) - garbage collector - **no sugar** - la core lib est là aussi pour apprendre et comprendre --- ## Go run fast
??? - ok c'est moins bien que Rust - proche du Java - quand tu viens d'un langage interprété, ça se pose là... - il est facile à scaler, merci les goroutines - garbage collector très efficace - **no warmup time** https://blog.golang.org/ismmkeynote --- ## Go is compiled ```sh GOOS=windows GOARCH=386 go build GOOS=darwin GOARCH=amd64 go build GOOS=linux GOARCH=arm64 go build GOOS=js GOARCH=wasm go build ``` ```sh go tool dist list aix/ppc64 android/386 android/amd64 android/arm android/arm64 darwin/386 darwin/amd64 darwin/arm darwin/arm64 dragonfly/amd64 freebsd/386 freebsd/amd64 freebsd/arm illumos/amd64 js/wasm linux/386 linux/amd64 linux/arm linux/arm64 linux/mips linux/mips64 linux/mips64le linux/mipsle linux/ppc64 linux/ppc64le linux/s390x nacl/386 nacl/amd64p32 nacl/arm netbsd/386 netbsd/amd64 netbsd/arm netbsd/arm64 openbsd/386 openbsd/amd64 openbsd/arm openbsd/arm64 plan9/386 plan9/amd64 plan9/arm solaris/amd64 windows/386 windows/amd64 windows/arm ``` ??? Go est un langage compilé - le temps de compilation est hyper rapide - on peut l'utiliser en dev quasiment comme un langage interprété - `go run` compile et run - un binaire compilé: deploiement simple et rapide - on peut compiler le programme vers n'importe quelle arch --- ## Backward compatible > Go programs that work today should continue to work even as future "point" releases of Go 1 arise (Go 1.1, Go 1.2, etc.). https://golang.org/doc/go1compat --- class: bottom, left # Now let's Go! Pierre Tachoire
pierre@tch.re
[krichprollsch](https://twitter.com/krichprollsch) ??? Go est un language qui a tout les arguments pour s'intégrer dans une stack existante ou nouvelle dans une entreprise. Il y'a souvent des fênetres qui demande l'introduction d'une nouvelle technologie et Go est un choix à prendre en compte qui sera payant très rapidement. Un exemple est l'utilisation de nodejs dans une stack pour gérer des websockets. Ses performances, les libs dispo et la facilité de mise en place font de Go un choix pertinent pour ce genre choses.