Die Programmiersprache Go

Die Programmiersprache Go

Vorstellung von Go bei einem flinc Lunch-Talk. Was ist Go? Was kann Go? Wofür kann ich Go benutzen?

324b2e4d8ae9fcbd7b2983f13481075a?s=128

Thorsten Ball

February 11, 2015
Tweet

Transcript

  1. Hallo! Thorsten Ball mrnugget / @thorstenball Software Developer

  2. @thorstenball Go Go

  3. @thorstenball Go Go’s Erfinder • Robert Griesemer (V8 Engine, HotSpot

    Java VM) • Rob Pike (Plan 9 Unix, UTF-8) • Ken Thompson (Unix, B, UTF-8)
  4. @thorstenball Go Ziele • "It must work at scale, for

    large programs with large numbers of dependencies, with large teams of programmers working on them.” • "It must be familiar, roughly C-like. [...] The need to get programmers productive quickly” • "It must be modern. [...] built in concurrency"
  5. @thorstenball Go Go • 2007 - erste Entwürfe • 2009

    - erste Version veröffentlicht • 2012 - Version 1.0 veröffentlicht • 2015 - Version 1.4
  6. @thorstenball Go Go • Kompiliert • Statisch • Garbage Collection

    • Concurrency • Schnell
  7. @thorstenball Go Wie sieht Go aus?

  8. @thorstenball Go Hello World package main import "fmt" func main()

    { fmt.Println("Hello World!") }
  9. @thorstenball Go Funktionen package main import "fmt" func SayHello(name string)

    { fmt.Println("Hello " + name) } func main() { SayHello("World!") SayHello("Go!") SayHello("flinc!") }
  10. @thorstenball Go Variablen package main import "fmt" var i int

    = 1 var name string = "Go" func main() { var x int = 2 var y = 3 z := 4 s := "bob" fmt.Println(i, name, x, y, z, s) }
  11. @thorstenball Go Flow-Control package main import "fmt" func main() {

    for i := 0; i < 10; i++ { if i % 2 == 0 { fmt.Println(i) } else { fmt.Println("no") } } // while == for sum := 1 for sum < 10 { sum += sum } }
  12. @thorstenball Go Structs package main import "fmt" type Person struct

    { Age int Name string } func main() { var bob Person bob.Age = 24 bob.Name = "Bob" anna := Person{Age: 27, Name: "Anna"} fmt.Printf("Name: %s, Age: %d\n", bob.Name, bob.Age) fmt.Printf("Name: %s, Age: %d\n", anna.Name, anna.Age) }
  13. @thorstenball Go Pointers! package main import "fmt" type Person struct

    { Name string } func SayName(p *Person) { fmt.Println(p.Name) } func main() { anna := &Person{Age: 27, Name: "Anna"} SayName(anna) }
  14. @thorstenball Go Programmieren mit Go

  15. @thorstenball Go Die Umgebung • $GOPATH • Source, Binary und

    Executable • Normale Verzeichnisse, keine “magic” • Verwaltung mit go-Tool
  16. @thorstenball Go $GOPATH bin/ hello # command executable outyet #

    command executable pkg/ linux_amd64/ github.com/golang/example/ stringutil.a # package object src/ github.com/golang/example/ .git/ # Git repository metadata hello/ hello.go # command source outyet/ main.go # command source main_test.go # test source stringutil/ reverse.go # package source reverse_test.go # test source
  17. @thorstenball Go Tools • Go hat viele Tools um mit

    Go-Code zu arbeiten • Der Großteil ist in der Standard-Installation enthalten • Tools sind sehr wichtig bei Go • Keine zusätzlichen Installationen nötig
  18. @thorstenball Go go Tool • go get • go build

    • go install • go test • go fmt • go test -race • go vet • go tool pprof
  19. @thorstenball Go go fmt

  20. @thorstenball Go Standard Library • Sehr groß • Sehr gut

    gepflegt • Der idiomatischste Go-Code (/usr/local/go/src)
  21. @thorstenball Go Standard Library • net/http - HTTP-Server und Client

    • io - I/O-Interfaces und Hilfsfunktionen • fmt - Formattiertes IO (Printf, Println, Sprintf) • flag - Command-Line Arguments • database/sql - Grundgerüst für SQL-Treiber • encoding/json - JSON-Parser • html/template - HTML-Templating Engine • …
  22. @thorstenball Go Packages

  23. @thorstenball Go Packages package foobar import "fmt" func Hello() {

    fmt.Println("Hello World!") }
  24. @thorstenball Go Packages package main import "github.com/mrnugget/foobar" func main() {

    foobar.Hello() }
  25. @thorstenball Go Packages • GroßGeschriebene Namen werden exportiert • kleinGeschriebene

    Namen werden nicht exportiert • Kein Monkey-Patching
  26. @thorstenball Go Package-Management

  27. @thorstenball Go Testing • Test-Framework ist mitgeliefert • import “testing”

    • foobar_test.go • go test
  28. @thorstenball Go Testing package foobar import "testing" func TestSayName(t *testing.T)

    { result := SayName() if result != "thorsten" { t.Error("result is wrong") } }
  29. @thorstenball Go Keine Klassen, keine Vererbung • Structs • Types

    • Methoden auf Structs/Types definierbar • First-class functions!
  30. @thorstenball Go Concurrency

  31. @thorstenball Go goroutines package main import "fmt" import "time" func

    ThreeTimes(line string) { for i := 0; i < 3; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(line) } } func main() { go ThreeTimes("hello") ThreeTimes("world") } // Output: world hello world hello world
  32. @thorstenball Go Channels

  33. @thorstenball Go Channels package main import "fmt" import "math/rand" import

    "time" func CalcNumber(results chan int) { time.Sleep(100 * time.Millisecond) results <- rand.Int() // blocking } func main() { results := make(chan int) go CalcNumber(results) go CalcNumber(results) num := <-results // blocking fmt.Println(num) num = <-results // blocking fmt.Println(num) }
  34. @thorstenball Go Wofür?

  35. @thorstenball Go Wofür? • Web-Services • Infrastruktur • Server •

    Command Line Tools
  36. @thorstenball Go Go wird eingesetzt von… • Google • Apple

    • Microsoft • Dropbox • GitHub • Shopify • Soundcloud • Heroku • Tumblr • 6Wunderkinder
  37. @thorstenball Go Go.

  38. @thorstenball Go Go lernen • tour.golang.org • golang.org/doc • blog.golang.org

    • Google “golang” (…)
  39. @thorstenball Go Danke