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

Go Basics Workshop

Go Basics Workshop

Johannes Pichler

July 06, 2018
Tweet

More Decks by Johannes Pichler

Other Decks in Programming

Transcript

  1. Golang • garbage collection • type safety • has pointers

    ! • concurrency with goroutines • object oriented but not class based 4
  2. The basics - package declaration package main import "fmt" func

    main() { fmt.Printf("Hello World!") } 6
  3. The basics - main function package main import "fmt" func

    main() { fmt.Printf("Hello World!") } 8
  4. Variables var abc string = "a string variable" var number

    int // number = 0 var emptyString string // emptyString = "" short := "a string variable" // var short string = "a string variable" 9
  5. Variables var abc string = "a string variable" var number

    int // number = 0 var emptyString string // emptyString = "" short := "a string variable" // var short string = "a string variable" 10
  6. Variables var abc string = "a string variable" var number

    int // number = 0 var emptyString string // emptyString = "" short := "a string variable" // var short string = "a string variable" 11
  7. Arrays // have a fixed size types := [5]int //

    [0 0 0 0 0] // values can be changed and retrieve types[2] = 3 // [0 0 3 0 0] val := types[2] // 3 // can be initialized on delaration types := [5]int{1, 2, 3, 4, 5} // [1 2 3 4 5] // can have more dimensions more := [2][3]int 12
  8. Arrays // have a fixed size types := [5]int //

    [0 0 0 0 0] // values can be changed and retrieve types[2] = 3 // [0 0 3 0 0] val := types[2] // 3 // can be initialized on delaration types := [5]int{1, 2, 3, 4, 5} // [1 2 3 4 5] // can have more dimensions more := [2][3]int 13
  9. Arrays // have a fixed size types := [5]int //

    [0 0 0 0 0] // values can be changed and retrieved types[2] = 3 // [0 0 3 0 0] val := types[2] // 3 // can be initialized on delaration types := [5]int{1, 2, 3, 4, 5} // [1 2 3 4 5] // can have more dimensions more := [2][3]int 14
  10. Arrays // have a fixed size types := [5]int //

    [0 0 0 0 0] // values can be changed and retrieve types[2] = 3 // [0 0 3 0 0] val := types[2] // 3 // can be initialized on delaration types := [5]int{1, 2, 3, 4, 5} // [1 2 3 4 5] // can have more dimensions more := [2][3]int 15
  11. Slices slice1 := make([]string, 3) // ["" "" ""] slice2

    := []string{"a", "b", "c"} // ["a" "b" "c"] slice1[0] = "a" // ["a" "" ""] var length = len(slice1) // 3 slice2 = append(slice2, "d") // ["a" "b" "c" "d"] 16
  12. Slices slice1 := make([]string, 3) // ["" "" ""] slice2

    := []string{"a", "b", "c"} // ["a" "b" "c"] slice1[0] = "a" // ["a" "" ""] var length = len(slice1) // 3 slice2 = append(slice2, "d") // ["a" "b" "c" "d"] 17
  13. Slices slice1 := make([]string, 3) // ["" "" ""] slice2

    := []string{"a", "b", "c"} // ["a" "b" "c"] slice1[0] = "a" // ["a" "" ""] var length = len(slice1) // 3 slice2 = append(slice2, "d") // ["a" "b" "c" "d"] 18
  14. Slices slice1 := make([]string, 3) // ["" "" ""] slice2

    := []string{"a", "b", "c"} // ["a" "b" "c"] slice1[0] = "a" // ["a" "" ""] var length = len(slice1) // 3 slice2 = append(slice2, "d") // ["a" "b" "c" "d"] 19
  15. Slices - slice slice := []string{"a", "b", "c", "d", "e",

    "f"} // [a b c d e f] slice[2:5] // [c d e] slice[2:] // [c d e f] slice[:5] // [a b c d e] 20
  16. Slices - slice slice := []string{"a", "b", "c", "d", "e",

    "f"} // [a b c d e f] slice[2:5] // [c d e] slice[2:] // [c d e f] slice[:5] // [a b c d e] 21
  17. Slices - slice slice := []string{"a", "b", "c", "d", "e",

    "f"} // [a b c d e f] slice[2:5] // [c d e] slice[2:] // [c d e f] slice[:5] // [a b c d e] 22
  18. Slices - slice slice := []string{"a", "b", "c", "d", "e",

    "f"} // [a b c d e f] slice[2:5] // [c d e] slice[2:] // [c d e f] slice[:5] // [a b c d e] 23
  19. Maps m := make(map[string]int) m["foo"] = 1 // map[foo:1] m["bar"]

    = 2 // map[foo:1 bar:2] len(m) // 2 delete(m, "foo") // map[bar:2] val, ok := m["bar"] // 2, true 24
  20. Maps m := make(map[string]int) m["foo"] = 1 // map[foo:1] m["bar"]

    = 2 // map[foo:1 bar:2] len(m) // 2 delete(m, "foo") // map[bar:2] val, ok := m["bar"] // 2, true 25
  21. Maps m := make(map[string]int) m["foo"] = 1 // map[foo:1] m["bar"]

    = 2 // map[foo:1 bar:2] len(m) // 2 delete(m, "foo") // map[bar:2] val, ok := m["bar"] // 2, true 26
  22. Maps m := make(map[string]int) m["foo"] = 1 // map[foo:1] m["bar"]

    = 2 // map[foo:1 bar:2] len(m) // 2 delete(m, "foo") // map[bar:2] val, ok := m["bar"] // 2, true 27
  23. Maps m := make(map[string]int) m["foo"] = 1 // map[foo:1] m["bar"]

    = 2 // map[foo:1 bar:2] len(m) // 2 delete(m, "foo") // map[bar:2] val, ok := m["bar"] // 2, true 28
  24. Loops - classic for for i := 0; i <=

    3; i++ { fmt.Println(i) } 30
  25. Loops - range numbers := []int{1, 2, 3} sum :=

    0 for i, val := range numbers { fmt.Println("index:", i) sum += val } fmt.Println("sum:", sum) 31
  26. Functions func sum(a int, b int) int { return a

    + b } // or func sum(a, b int) int { return a + b } 32
  27. Multiple return values func fancySum(a int, b int) (int, bool)

    { ok := true // some error checks return a + b, ok } func main() { sum, ok := fancySum(1, 2) if !ok { // fail with error } } 33
  28. Structs type person struct { firstname string lastname string age

    int } person1 := person{firstname: "John", lastname: "Doe", age: 28} person2 := person{"Jane", "Doe", 28} fmt.Println(person1.age) 34
  29. Structs composition type Model struct { ID int CreateDate time.Time

    ChangeDate time.Time } type User struct { Model Firstname string Lastname string } 36
  30. Structs composition user := User{ ID: 1, Firstname: "John", Lastname:

    "Doe", CreateDate: time.Now(), ChangeDate: time.Now(), } user.ID == user.Model.ID // true 37
  31. Interfaces func (c cat) color() string { if c.name ==

    "Kitty" { return "black" } return "white" } func (m mouse) color() string { return "grey" } 40
  32. Interfaces func print(a animal) { fmt.Println(a.color()) } func main() {

    c1 := cat{"Kitty"} c2 := cat{"Miau"} m := mouse{"Pinky"} print(c1) // black print(c2) // white print(m) // grey } 41
  33. Hands On #1 • Add • Sub • Mul •

    Div • Fib - iterativ 43
  34. Company API • gorm.io • github.com/gorilla/mux • github.com/google/jsonapi { "data":

    { "id": 1, "type": "company", "attributes": { "name": "karriere.at", "zip": "4020", "city": "Linz" } } } 46
  35. Goroutines func doSomeWork() { for i := 0; i <

    5; i++ { fmt.Println("Work index:", i) } } func main() { go doSomeWork() // continue with main thread flow } 48
  36. Channels • used for communication between goroutines • sender sends

    messages, receiver reads from channel • channels are basically blocking except they are buffered 49
  37. Channels // create a channel messages := make(chan string) //

    send a message messages <- "a message" // read a message msg := <- messages 50
  38. Channels // create a channel messages := make(chan string) //

    send a message messages <- "a message" // read a message msg := <- messages 51
  39. Channels // create a channel messages := make(chan string) //

    send a message messages <- "a message" // read a message msg := <- messages 52
  40. Tooling for Go • code formating • linting • testing

    • benchmarking • documentation • profiling 54
  41. my golang favorites • strong type system • error handling/multiple

    return values • implicit interfaces • built-in tooling • concurrency • speed 55
  42. Helpful resources • A Tour of Go https://tour.golang.org • Go

    by Example https://gobyexample.com • List of Go Books https://github.com/dariubs/GoBooks 56