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

Go - schlanke, parallele Software-Entwicklung

Go - schlanke, parallele Software-Entwicklung

Go ist eine von Google gestartete und mittlerweile als Open Source freigegebene Programmiersprache. Sie ist auf die Programmierung im Serverumfeld mit vielen nebenläufigen Programmteilen ausgelegt und besitzt einen Garbage Collector. Außerdem ist sie sehr schlank: Das Deployment für einen einzelnen Microservice macht nur wenige hundert Kilobyte aus. Der Vortrag zeigt die Syntax und die wesentlichen Bestandteile der Sprache sowie das in Go verwendete Konzept der Parallelität. Auf dem Weg werden wir an einigen beliebten Fehlerquellen und Problemen vorbei kommen und uns deren Ursachen und Lösungen ansehen.

Tobias Breitwieser

March 31, 2016
Tweet

More Decks by Tobias Breitwieser

Other Decks in Programming

Transcript

  1.   Go, was ist das? •  Entwickelt von Google

    (Start 2009, Release 2012) •  Syntax beeinflusst von C •  Static Typing •  Garbage Collection •  Easy Concurrency with Communicating Sequential Processes 06.08.16 3 Tobias Breitwieser
  2.   Nutzt das eigentlich jemand? •  Docker •  Google

    (dl.google.com, vitness, Kubernetes) •  HashiCorp (Packer, Nomad, Consul) •  Facebook •  Dropbox •  6Wunderkinder •  Gov.uk 06.08.16 Tobias Breitwieser 4
  3.   Syntax – Grundstruktur package main import ( "fmt”

    "golang.org/x/crypto/sha3" ) func main() { fmt.Println("Hello World!") } •  Jede Datei muss einem package angehören •  main.main() ist der Startpunkt der Ausführung •  Imports direkt aus git Repositories golang.org/x/crypto 06.08.16 Tobias Breitwieser 5
  4.   Syntax – Funktionen func privateFunction(param int) (string, int){

    return "hello", 1 } func privateFunction2(param int) string{ return "hello" } func PublicFunction(){} •  kleingeschrieben -> private/nicht exportiert •  großgeschrieben -> public/ exportiert •  mehrere Rückgabewerte möglich 06.08.16 Tobias Breitwieser 6
  5.   Syntax – Funktionen - defer func function(){ defer

    fmt.Println(" World") fmt.Print("Hello") } -> Hello World •  Defer wird beim Verlassen der Funktion aufgerufen •  typisch genutzt zum Schließen von Streams und Filehandles 06.08.16 Tobias Breitwieser 7
  6.   Syntax – Datenstrukturen - Variablen var var1 int64

    var1 = 1 var Var2 int64 var3 := 1 •  globale Variablen müssen 1. Form erfüllen •  in Funktionen und Methoden kann beides genutzt werden •  klein geschrieben -> Variable nicht exportiert •  groß geschrieben -> Variable wird exportiert 06.08.16 Tobias Breitwieser 8
  7.   Syntax – Datenstrukturen - Slices Inline Daten: letters

    := []string{"a", "b", "c", "d"} Ohne Daten direkte Daten: func make([]T, len, cap) []T var s []byte s = make([]byte, 5, 5) // s == []byte{0, 0, 0, 0, 0} •  keine feste Länge •  erweiterbar •  Zugriff auf Subslices •  letters[1:4] -> []string{"b", "c", "d"} •  letters[1:] bringt das gleiche Ergebnis 06.08.16 Tobias Breitwieser 9
  8.   Syntax – Datenstrukturen - Structs Deklaration: type myType

    struct { one int two string error } func (m myType) Method1(){} func (m *myType) Method2(){} •  Error ist ein embedded type •  kann direkt über myType aufgerufen werden •  Method1 hat eine Kopie der Daten, kann das Original also nicht bearbeiten •  Method2 hat einen Pointer zu den Daten, kann diese also bearbeiten 06.08.16 Tobias Breitwieser 10
  9.   Syntax – Datenstrukturen - Channels Definition: var mychan

    chan myType Erstellen ohne Buffer: mychan = make(chan myType) mychan := make(chan myType) Erstellen mit Buffer: mychan = make(chan myType, 10) Lesen: myvar := <-mychan Schreiben: mychan<- myvar •  Inter-goroutine-communication •  wie OS Pipes •  kann ohne Buffer zum Synchronisieren von Go- Routinen genutzt werden •  Der Standardweg zum Kommunizieren unter Go- Routinen 06.08.16 Tobias Breitwieser 11
  10.   Syntax – Pointer var p *int i :=

    42 p = &i •  keine Pointer-Arethmetik •  * definiert den Pointer-Typ •  * dereferenziert •  & generiert einen Pointer •  Channel verhalten sich wie Pointer bei der Übergabe 06.08.16 Tobias Breitwieser 12
  11.   Syntax – Interfaces type error interface { Error()

    string } type errorString struct { s string } func (e *errorString) Error() string { return e.s } •  Struct erfüllt das Interface implizit •  wenn Interface erfüllt, struct auch vom Typ des Interfaces 06.08.16 Tobias Breitwieser 13
  12.   Syntax – Kontrollstrukturen - For C For Style:

    for init; condition; post { } C While Style: for condition { } Infinit loop: for { } Iterating over Slice or Map: for index, value := range mySlice {} Reading from Channel: for value := range myChannel {} •  While nicht vorhanden •  Index kann durch _ ersetzt werden falls nicht benötigt •  zweite variable kann entfernt werden falls nur der Index benötigt wird 06.08.16 Tobias Breitwieser 14
  13.   Syntax – Kontrollstrukturen - If / Switch If:

    if condition {} else{} Switch: switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") default: fmt.Printf("%s.", os) } •  ähnlich zu C Syntax •  Klammern fallen weg 06.08.16 Tobias Breitwieser 15
  14.   Syntax – Kontrollstrukturen - Select select { case

    msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) default: } •  blockt, bis eine der Kommunikationen erfolgreich war (ohne default) •  mit default case wird bei Blockieren der default case ausgeführt •  bei mehreren freien Kommunikationsmöglichkeiten wird eine per Zufall ausgewählt 06.08.16 Tobias Breitwieser 16
  15.   Syntax – Go-Routine go function() •  startet eine

    neue Go-Routine •  keine OS Threads •  Nebenläufig •  keine Kontrolle von außen •  kontrollierbar mit übergebenen Channeln 06.08.16 Tobias Breitwieser 17
  16.   Error Handling func Scan() (token []byte, error) token,

    err := Scan() if err != nil { println(err) } •  Errors sind normale Rückgabewerte •  Keine Exceptions •  Panic() für schwerwiegende •  Beendet das Programm falls es ist durch recover() •  Führt noch alle defer statements aus 06.08.16 Tobias Breitwieser 18
  17.   Generics •  gibt es nicht •  viele Diskussionen

    in der Community •  Evtl. in Go 2.0, falls ein Weg gefunden wird, sie einfach und sauber zu implementieren 06.08.16 Tobias Breitwieser 19
  18.   IDE •  Vim •  IntelliJ (open source plugin

    im alpha/beta Stadium) •  Atom •  … 06.08.16 Tobias Breitwieser 20
  19.   IDE VIM •  Console •  aktive Community • 

    viele Features •  schlank •  nutzt das offizielle Tooling IntelliJ •  GUI •  langsames aber aktive Entwicklung •  kein Refactoring wie man es aus IntelliJ kennt 06.08.16 Tobias Breitwieser 21
  20.   Paketverwaltung – Das Problem •  Standard über direkten

    Bezug aus den Repositories anderer im Import Statement •  keine reproduzierbare Builds •  keine Kontrolle über Breaking Changes •  kann nicht erreichbar sein •  kann gelöscht werden 06.08.16 Tobias Breitwieser 22
  21.   Paketverwaltung – Eine Lösung - Vendoring Pros • 

    ab Go 1.6 offiziell unterstützt •  Kontrolle über den Code •  Bugfixes möglich •  keine Probleme mit gelöschten oder geänderten Repositories •  keine Probleme mit Breaking Changes Cons •  manuelle Updates •  evtl. Lizenzprobleme •  bei manchen Tools Änderungen im Code nötig •  noch wenig offizielles Tooling für das Built-in Vendoring 06.08.16 Tobias Breitwieser 23
  22.   Für was nutze ich GO eigentlich? •  Serveranwendungen

    •  HTTP2 support build in •  SSH support build in •  Crypto für viele dinge build in •  unterstützt moderne TLS Settings •  Kommandozeilen Tools 06.08.16 Tobias Breitwieser 24
  23.   Und was ist mit UI? •  Viele bindings

    für verschiedene Systeme verfügbar •  Gtk •  Qt •  Mac •  Windows •  native Go-Implementierung in Arbeit (3th party) •  noch nicht sehr verbreitet •  kein Hauptaugenmerk bei der Entwicklung von GO 06.08.16 Tobias Breitwieser 25
  24.   Mobile •  ab 1.5 experimenteller Support •  unterstützt

    Android und iOS •  Performance Impact durch Language Bindings 06.08.16 Tobias Breitwieser 26
  25.   Code? •  Ein kleiner Chat über SSH join

    06.08.16 Tobias Breitwieser 27
  26.   Was kommt als Nächstes? TDD in Action von

    Konstantin Diener 06.08.16 Tobias Breitwieser 28