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

Go Basics Workshop

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Go Basics Workshop

Avatar for Johannes Pichler

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