De Python à Go?

Découvrir l'écosystème Go

Balthazar Rouberol

But de la présentation

Vous donner un aperçu de la philosophie de Go, de son écosystème, et de ses outils (plus que de sa syntaxe) afin d'aider les curieux à sauter le pas.

Présentation disponible à http://brouberol-talks.appspot.com/2014/py2go/

Go

Langage récemment développé par Google: v1 annoncée en mars 2012.

i := 0     // inféré
int i = 0  // explicite

Philosophie

Le zen of Python s'applique bien à Go (Go and the Zen of Python)

Exemple: "Simple is better than complex"

Pourquoi Go ?

Go est jeune (4 ans) mais très à la mode.

mais...

Nombre de dépôts Github par langage

Go arrive 15e, Python 5e.

Applications courantes

Pourquoi Go depuis Python ?

Et mon confort?

Qui l'utilise?

«Important batteries included»

Bibliothèque standard fournie: 133 modules (http://golang.org/pkg/)

Note: Python2.7: 297 modules & Python3.4: 233 modules

«Important batteries included»

Les outils de développement font partie du langage.

Facilité d'installation: ce ne sont que des commandes du binaire go.

Hello world

// Implementation of a hello world in Go

package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}

Dans le shell:

$ go run hello.go
Hello, 世界

Hello world dans le browser

// Minimal boilerplate to implement a web server in Go

package main

import "net/http"

func HelloHandler(w http.ResponseWriter, req *http.Request) {
    w.Write([]byte("hello, world!\n"))
}

func main() {
    http.HandleFunc("/", HelloHandler)
    http.ListenAndServe(":8888", nil)
}

Hello world concurrent

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func HelloWorld(i int, c chan string) {
    time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
    c <- fmt.Sprintf("%d - Hello World\n", i)
}

func main() {
    rand.Seed(time.Now().UTC().UnixNano()) // initiate the seed
    c := make(chan string)
    for i := 1; i <= 10; i++ {
        go HelloWorld(i, c)
    }
    for i := 1; i <= 10; i++ {
        fmt.Printf(<-c) // block until the channel is ready to send a value, and print it
    }
    close(c)
}

Imports & packaging

$ go get github.com/gorilla/mux
$ ls $GOPATH/src/github.com | grep gorilla
gorilla
package main

import (
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    r.HandleFunc("/products", ProductsHandler)
    r.HandleFunc("/articles", ArticlesHandler)
    http.Handle("/", r)
}

Mes outils préférés

$ Watch -t go test github.com/brouberol/todo...

Conclusion

Go est un langage très minimaliste, bien qu'assez complet. Sa philosophie se rapproche souvent de celle de Python.

Pour finir

«Go feels under-engineered because it only solves real problems»

«Go turned out to be a language for solving real problems rather than a language filled with beautiful tools, and so you build real solutions rather than finding excuses to use your beautiful tools.»

http://robnapier.net/go-is-a-shop-built-jig

Balthazar Rouberol