Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pourquoi Maurice ne doit surtout pas coder en Go.

Pourquoi Maurice ne doit surtout pas coder en Go.

Tweet

More Decks by Jean-Laurent de Morlhon

Other Decks in Technology

Transcript

  1. #DevoxxFR Go @ Docker 8 Docker And Go, Why did

    we decide to write docker in go - http://fr.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-go
  2. #DevoxxFR for-loop with range 12 func missingOpenedPorts(rule *raw.Firewall, ports []string)

    []string { missing := []string{} opened := map[string]bool{} for _, allowed := range rule.Allowed { for _, allowedPort := range allowed.Ports { opened[allowedPort] = true } } for _, port := range ports { if !opened[port] { missing = append(missing, port) } } return missing }
  3. #DevoxxFR Gestion d'erreur 13 func shellCfgSet(c CommandLine, api libmachine.API) (*ShellConfig,

    error) { if len(c.Args()) > 1 { return nil, ErrExpectedOneMachine } target, err := targetHost(c, api) if err != nil { return nil, err } host, err := api.Load(target) if err != nil { return nil, err } dockerHost, _, err := check.DefaultConnChecker.Check(host, c.Bool("swarm")) if err != nil { return nil, fmt.Errorf("Error checking TLS connection: %s", err) } userShell, err := getShell(c.String("shell")) if err != nil { return nil, err }
  4. #DevoxxFR one-liner ftw ! 14 if out, err := provisioner.SSHCommand("sudo

    docker version"); err != nil { log.Warnf("Error getting SSH command to check if the daemon is up: %s", err) log.Debugf("'sudo docker version' output:\n%s", out) return false } // The daemon is up if the command worked. Carry on. return true
  5. #DevoxxFR defer 15 func TestDetect(t *testing.T) { currentShell := os.Getenv("SHELL")

    os.Setenv("SHELL", "") defer os.Setenv("SHELL", currentShell) shell, err := Detect() assert.Equal(t, "cmd", shell) assert.NoError(t, err) }
  6. #DevoxxFR defer one-liner ftw! 16 func TestDetect(t *testing.T) { defer

    func(shell string) { os.Setenv("SHELL", shell) }(os.Getenv("SHELL")) os.Setenv("SHELL", "") shell, err := Detect() assert.Equal(t, "cmd", shell) assert.NoError(t, err) }
  7. #DevoxxFR Go venant de java / .net • Pas d'héritage

    • Pas de Générique • Une forme de polymorphisme avec les interfaces • Presque aucun idiomes fonctionnels actuels ( fold, map, filter...) • Outillage rustique • Pas de "Shared Library" 19
  8. #DevoxxFR Go & le craftsman • Simple, efficace, va à

    l'essentiel • Code est verbeux -> Se lit facilement • il y a beaucoup de repetition ( !DRY ) • ... et les tests 20
  9. #DevoxxFR Tester avec go 22 • go test Outil standard

    fourni avec go • Fait du coverage de source par défaut • Possède des flags comme -benchtime, -parallel • Dans la doc de go test aucune mention d'assertion
  10. #DevoxxFR go build • go build outil fourni en standard

    • Pour aller plus loin... makefile / bash 24
  11. #DevoxxFR Bibliothèques Tierces • go get outil fourni en standard

    • Exemple : go get github.com/stretchr/testify • Telecharge et copie dans le $GOPATH 25
  12. #DevoxxFR $GOPATH ? • $GOPATH repertoire où se melange •

    bibliothèques externes • vos propres sources 26
  13. #DevoxxFR Dépendances ? • Notion de vendoring • Copier les

    bibliothèques tierces dans son propre source • Dans un repertoire dédié /vendor 27
  14. #DevoxxFR go dep 28 • go dep outil fourni en

    standard • go dep save : Cree la liste des dépendances • go dep restore : Récupère les dépendances
  15. #DevoxxFR go fmt 29 gofmt formats Go programs. It uses

    tabs (width = 8) for indentation and blanks for alignment.
  16. #DevoxxFR go lint & go vet 30 func NewFileHook() *log.fileHook

    { exported func NewFileHook returns unexported type *log.fileHook, which can be annoying to use
  17. #DevoxxFR go lint & go vet 31 don't use underscores

    in Go names; var original_shell should be originalShell var original_shell string
  18. #DevoxxFR go lint & go vet 32 "Println call ends

    with newline" fmt.Println("Usage:\n")
  19. #DevoxxFR References 35 • Les 3 pubs de Maurice -

    https://www.youtube.com/watch?v=Pj88mqcLVBY • vim-go : https://github.com/fatih/vim-go • Is Go An Object Oriented Language? - http://spf13.com/post/is-go-object-oriented • Go Object Oriented Design - https://nathany.com/good • Function types in golang - http://jordanorelli.com/post/42369331748/function-types-in-go-golang • Docker And Go, Why did we decide to write docker in go - http://fr.slideshare.net/jpetazzo/ docker-and-go-why-did-we-decide-to-write-docker-in-go • Go for Java Programmers - https://talks.golang.org/2015/go-for-java-programmers.slide • Go for Javaneros - https://talks.golang.org/2014/go4java.slide#1