Slide 1

Slide 1 text

INTRO  TO  GO

Slide 2

Slide 2 text

SETH VARGO @sethvargo

Slide 3

Slide 3 text

SETH VARGO @sethvargo

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

HISTORY

Slide 8

Slide 8 text

2007

Slide 9

Slide 9 text

2007

Slide 10

Slide 10 text

2007 C and Java Ruby and Python NodeJS Scala "MODERN" JavaScript Objective-C/Swift

Slide 11

Slide 11 text

2007 2008 C and Java Ruby and Python NodeJS Scala "MODERN" Pick one: - efficient compilation - efficient execution - ease of development PROBLEMS Type safety Modern JavaScript Objective-C/Swift

Slide 12

Slide 12 text

2007 2008 C and Java Ruby and Python NodeJS Scala "MODERN" Pick one: - efficient compilation - efficient execution - ease of development PROBLEMS REQUIREMENTS Compile FAST Execute FAST Concurrency Support for dependencies Built-in GC Good enough for Google Type safety Modern JavaScript Objective-C/Swift

Slide 13

Slide 13 text

2007 2008 2009 C and Java Ruby and Python NodeJS Scala "MODERN" Pick one: - efficient compilation - efficient execution - ease of development PROBLEMS REQUIREMENTS Compile FAST Execute FAST Concurrency Support for dependencies Go! Built-in GC Good enough for Google Type safety Modern JavaScript Objective-C/Swift

Slide 14

Slide 14 text

2007 2008 2009 C and Java Ruby and Python NodeJS Scala "MODERN" Pick one: - efficient compilation - efficient execution - ease of development PROBLEMS REQUIREMENTS Compile FAST Execute FAST Concurrency Support for dependencies 2015 today Built-in GC Good enough for Google Type safety Modern JavaScript Objective-C/Swift

Slide 15

Slide 15 text

OVERVIEW

Slide 16

Slide 16 text

GO  HAS SOLID CORE

Slide 17

Slide 17 text

GO  HAS A ROBUST COMMUNITY

Slide 18

Slide 18 text

GO  HAS INCREDIBLE PERFORMANCE

Slide 19

Slide 19 text

GO  HAS BUILT-IN LINTING AND FORMATTING

Slide 20

Slide 20 text

GO  HAS EASY CROSS-PLATFORM BINARIES

Slide 21

Slide 21 text

GO  HAS INTERNAL GC

Slide 22

Slide 22 text

GO  DOES  NOT  HAVE A PRETTY WEBSITE

Slide 23

Slide 23 text

GO  DOES  NOT  HAVE GENERICS

Slide 24

Slide 24 text

GO  DOES  NOT  HAVE SEO

Slide 25

Slide 25 text

INSTALL

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

$GOPATH

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

package main import "fmt" // this is a comment func main() { fmt.Println("Hello World!") } example.go

Slide 30

Slide 30 text

package main import "fmt" // this is a comment func main() { fmt.Println("Hello World!") } example.go

Slide 31

Slide 31 text

package main import "fmt" // this is a comment func main() { fmt.Println("Hello World!") } example.go

Slide 32

Slide 32 text

package main import "fmt" // this is a comment func main() { fmt.Println("Hello World!") } example.go

Slide 33

Slide 33 text

package main import "fmt" // this is a comment func main() { fmt.Println("Hello World!") } example.go

Slide 34

Slide 34 text

package main import "fmt" // this is a comment func main() { fmt.Println("Hello World!") } example.go

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 38

Slide 38 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 39

Slide 39 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 40

Slide 40 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 41

Slide 41 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 42

Slide 42 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 43

Slide 43 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 44

Slide 44 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 45

Slide 45 text

package main func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 46

Slide 46 text

package main func main() { reader := bufio.NewReader(os.Stdin) text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 47

Slide 47 text

package main func main() { reader := bufio.NewReader(os.Stdin) text, err := reader.ReadString('\n') fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 48

Slide 48 text

package main func main() { text, err := reader.ReadString('\n') fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 49

Slide 49 text

package main func main() { text, := "Hi\n" fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 50

Slide 50 text

package main func main() { text, := "Hi\n" fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace("Hi\n"))) } example.go

Slide 51

Slide 51 text

package main func main() { text, := "Hi\n" fmt.Println(fmt.Sprintf("Your name is %q!", "Hi")) } example.go

Slide 52

Slide 52 text

package main func main() { text, := "Hi\n" fmt.Println(fmt.Sprintf("Your name is \"Hi\"!")) } example.go

Slide 53

Slide 53 text

package main func main() { text, := "Hi\n" fmt.Println("Your name is \"Hi\"!") } example.go

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 56

Slide 56 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } ? example.go

Slide 57

Slide 57 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 58

Slide 58 text

package main import ( "bufio" "fmt" "os" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 59

Slide 59 text

package main import ( "bufio" "fmt" "os" "strings" "io/ioutil" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Your name: ") text, err := reader.ReadString('\n') if err != nil { fmt.Println("error:", err.Error()) return } fmt.Println(fmt.Sprintf("Your name is %q!", strings.TrimSpace(text))) } example.go

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

FIZZBUZZ

Slide 62

Slide 62 text

def fizzbuzz(max) 1.upto(max) do |i| if i % 5 == 0 and i % 3 == 0 puts "FizzBuzz" elsif i % 3== 0 puts "Fizz" elsif i % 5 == 0 puts "Buzz" else puts i end end end fizzbuzz.rb

Slide 63

Slide 63 text

func fizzbuzz(max int) { for i := 1; i <= max; i++ { if i %3 == 0 && i %5 == 0 { fmt.Println("Fizzbuzz") } else if i%3 == 0 { fmt.Println("Fizz") } else if i%5 == 0 { fmt.Println("Buzz") } else { fmt.Println(i) } } } fizzbuzz.go

Slide 64

Slide 64 text

func fizzbuzz(max int) { for i := 1; i <= max; i++ { if i %3 == 0 && i %5 == 0 { fmt.Println("Fizzbuzz") } else if i%3 == 0 { fmt.Println("Fizz") } else if i%5 == 0 { fmt.Println("Buzz") } else { fmt.Println(i) } } } fizzbuzz.go def fizzbuzz(max) 1.upto(max) do |i| if i % 5 == 0 and i % 3 == 0 puts "FizzBuzz" elsif i % 3== 0 puts "Fizz" elsif i % 5 == 0 puts "Buzz" else puts i end end end fizzbuzz.rb

Slide 65

Slide 65 text

func fizzbuzz(max int) { for i := 1; i <= max; i++ { if i %3 == 0 && i %5 == 0 { fmt.Println("Fizzbuzz") continue } if i%3 == 0 { fmt.Println("Fizz") continue } if i%5 == 0 { fmt.Println("Buzz") continue } fmt.Println(i) } } fizzbuzz.go def fizzbuzz(max) 1.upto(max) do |i| if i % 5 == 0 and i % 3 == 0 puts "FizzBuzz" next end if i % 3== 0 puts "Fizz" next end if i % 5 == 0 puts "Buzz" next end puts i end end fizzbuzz.rb

Slide 66

Slide 66 text

FIBONACCI

Slide 67

Slide 67 text

def fib(max) if max < 2 return max else return fib(max-1) + fib(max-2) end end fib.rb

Slide 68

Slide 68 text

func fib(max int) int { if max < 2 { return max } else { return fib(max-1) + fib(max-2) } } fib.go

Slide 69

Slide 69 text

func fib(max int) int { if max < 2 { return max } else { return fib(max-1) + fib(max-2) } } fib.go def fib(max) if max < 2 return max else return fib(max-1) + fib(max-2) end end fib.rb

Slide 70

Slide 70 text

func fib(max int) int { if max < 2 { return max } else { return fib(max-1) + fib(max-2) } } fib.go def fib(max) if max < 2 return max else return fib(max-1) + fib(max-2) end end fib.rb fib(40) fib(40)

Slide 71

Slide 71 text

func fib(max int) int { if max < 2 { return max } else { return fib(max-1) + fib(max-2) } } fib.go def fib(max) if max < 2 return max else return fib(max-1) + fib(max-2) end end fib.rb fib(40) 1.02s user 0.01s system 99% cpu 1.027 total fib(40)

Slide 72

Slide 72 text

func fib(max int) int { if max < 2 { return max } else { return fib(max-1) + fib(max-2) } } fib.go def fib(max) if max < 2 return max else return fib(max-1) + fib(max-2) end end fib.rb fib(40) 1.02s user 0.01s system 99% cpu 1.027 total fib(40) 17.37s user 0.04s system 99% cpu 17.467 total

Slide 73

Slide 73 text

func fib(max int) int { i, j := 0, 1 for c := 0; c < max; c++ { i, j = i+j, i } return i } fib.go fib(40)

Slide 74

Slide 74 text

func fib(max int) int { i, j := 0, 1 for c := 0; c < max; c++ { i, j = i+j, i } return i } fib.go fib(40) 0.00s user 0.00s system 74% cpu 0.004 total

Slide 75

Slide 75 text

func fib(max int) int { i, j := 0, 1 for c := 0; c < max; c++ { i, j = i+j, i } return i } fib.go fib(1000)

Slide 76

Slide 76 text

func fib(max int) int { i, j := 0, 1 for c := 0; c < max; c++ { i, j = i+j, i } return i } fib.go fib(1000) 0.00s user 0.00s system 72% cpu 0.004 total

Slide 77

Slide 77 text

func fib(max int) int { i, j := 0, 1 for c := 0; c < max; c++ { i, j = i+j, i } return i } fib.go fib(1000) 0.00s user 0.00s system 72% cpu 0.004 total 43466557686937456435688527675040625802564660517371780402481729089536555417 94905189040387984007925516929592259308032263477520968962323987332247116164 2996440906533187938298969649928516003704476137795166849228875

Slide 78

Slide 78 text

func fibGenerator() ? { return ? } fib.go

Slide 79

Slide 79 text

func fibGenerator() ? { return ? } fib.go (some closureyish thing)

Slide 80

Slide 80 text

func fibGenerator() ? { for i, j := 0, 1; ; i, j = i+j, i { // do something with i } return ? } fib.go

Slide 81

Slide 81 text

func fibGenerator() ? { func() { for i, j := 0, 1; ; i, j = i+j, i { // do something with i } }() return ? } fib.go

Slide 82

Slide 82 text

func fibGenerator() ? { go func() { for i, j := 0, 1; ; i, j = i+j, i { // do something with i } }() return ? } fib.go

Slide 83

Slide 83 text

func fibGenerator() ? { c := someMagicalGenerator() go func() { for i, j := 0, 1; ; i, j = i+j, i { // do something with i } }() return ? } fib.go

Slide 84

Slide 84 text

func fibGenerator() ? { c := someMagicalGenerator() go func() { for i, j := 0, 1; ; i, j = i+j, i { c.send(i) } }() return ? } fib.go

Slide 85

Slide 85 text

func fibGenerator() ? { c := someMagicalGenerator() go func() { for i, j := 0, 1; ; i, j = i+j, i { c.send(i) } }() return c } fib.go

Slide 86

Slide 86 text

someMagicalGenerator() ??? fib.go

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

func fibGenerator() ? { c := someMagicalGenerator() go func() { for i, j := 0, 1; ; i, j = i+j, i { c.send(i) } }() return c } fib.go

Slide 89

Slide 89 text

func fibGenerator() ? { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c.send(i) } }() return c } fib.go

Slide 90

Slide 90 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c.send(i) } }() return c } fib.go

Slide 91

Slide 91 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c.send(i) } }() return c } fib.go

Slide 92

Slide 92 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } fib.go

Slide 93

Slide 93 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } func main() { fib := fibGenerator() for i := 0; i < 25; i++ { fmt.Println( ? ) } } fib.go

Slide 94

Slide 94 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } func main() { fib := fibGenerator() for i := 0; i < 25; i++ { fmt.Println(<-fib) } } fib.go

Slide 95

Slide 95 text

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 fib.go

Slide 96

Slide 96 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } func main() { fib := fibGenerator() for i := 0; i < 25; i++ { fmt.Println(<-fib) } } fib.go

Slide 97

Slide 97 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } func main() { fib1 := fibGenerator() fib2 := fibGenerator() for i := 0; i < 5; i++ { fmt.Println(<-fib1) } for i := 0; i < 5; i++ { fmt.Println(<-fib2) } } fib.go

Slide 98

Slide 98 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } func main() { fib1 := fibGenerator() fib2 := fibGenerator() for i := 0; i < 5; i++ { fmt.Println(<-fib1) } for i := 0; i < 5; i++ { fmt.Println(<-fib2) } } fib.go

Slide 99

Slide 99 text

go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() fib.go

Slide 100

Slide 100 text

for i, j := 0, 1; ; i, j = i+j, i { c <- i } fib.go

Slide 101

Slide 101 text

for i, j := 0, 1; ; i, j = i+j, i { c <- i } fib.go

Slide 102

Slide 102 text

for { c <- i } fib.go

Slide 103

Slide 103 text

func fibGenerator() <-chan int { c := make(chan int) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } fib.go

Slide 104

Slide 104 text

func fibGenerator() <-chan int { c := make(chan int, 50) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } fib.go

Slide 105

Slide 105 text

func fibGenerator() <-chan int { c := make(chan int, 50) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } fib.go

Slide 106

Slide 106 text

func fibGenerator() <-chan int { c := make(chan int, 50) go func() { for i, j := 0, 1; ; i, j = i+j, i { c <- i } }() return c } fib.go

Slide 107

Slide 107 text

STRUCTS

Slide 108

Slide 108 text

type fib struct { // buffer is the size of the channel buffer. buffer int // ch is the internal channel where numbers are written. ch chan int } structs.go

Slide 109

Slide 109 text

type Fib struct { // Buffer is the size of the channel buffer. Buffer int // Ch is the internal channel where numbers are written. Ch chan int } structs.go

Slide 110

Slide 110 text

type Fib struct { // Buffer is the size of the channel buffer. Buffer int // Ch is the internal channel where numbers are written. Ch chan int } func PublicFunc() {} func privateFunc() {} structs.go

Slide 111

Slide 111 text

type fib struct { // buffer is the size of the channel buffer. buffer int // ch is the internal channel where numbers are written. ch chan int } structs.go

Slide 112

Slide 112 text

type fib struct { // buffer is the size of the channel buffer. buffer int // ch is the internal channel where numbers are written. ch chan int } func NewFib(b int) (*Fib, error) { f := new(fib) f.buffer = b f.ch = make(chan int, b) go func(f *Fib) { for i, j := 0, 1; ; i, j = i+j, i { f.ch <- i } }(f) return f, nil } structs.go

Slide 113

Slide 113 text

func main() { f, err := NewFib(10) if err != nil { panic(err) } for i := 0; i < 10; i++ { fmt.Println(<-f.ch) } } structs.go

Slide 114

Slide 114 text

func main() { f, err := NewFib(10) if err != nil { panic(err) } for i := 0; i < 10; i++ { fmt.Println(<-f.ch) } } structs.go

Slide 115

Slide 115 text

type fib struct { // buffer is the size of the channel buffer. buffer int // ch is the internal channel where numbers are written. ch chan int } structs.go

Slide 116

Slide 116 text

type Fib struct { // buffer is the size of the channel buffer. buffer int // ch is the internal channel where numbers are written. ch chan int } // Next gets the next number in the fib sequence. func (f *fib) Next() int { } structs.go

Slide 117

Slide 117 text

type Fib struct { // buffer is the size of the channel buffer. buffer int // ch is the internal channel where numbers are written. ch chan int } // Next gets the next number in the fib sequence. func (f *fib) Next() int { return <-f.ch } structs.go

Slide 118

Slide 118 text

func main() { f, err := NewFib(10) if err != nil { panic(err) } for i := 0; i < 10; i++ { fmt.Println(<-f.ch) } } structs.go

Slide 119

Slide 119 text

func main() { f, err := NewFib(10) if err != nil { panic(err) } for i := 0; i < 10; i++ { fmt.Println(f.Next()) } } structs.go

Slide 120

Slide 120 text

func main() { f, err := NewFib(10) if err != nil { panic(err) } for { fmt.Println(f.Next()) time.Sleep(100 * time.Millisecond) } } structs.go

Slide 121

Slide 121 text

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 structs.go

Slide 122

Slide 122 text

1779979416004714189 2880067194370816120 4660046610375530309 7540113804746346429 -6246583658587674878 1293530146158671551 -4953053512429003327 -3659523366270331776 -8612576878699335103 6174643828739884737 -2437933049959450366 3736710778780434371 1298777728820984005 5035488507601418376 6334266236422402381 -7076989329685730859 -742723093263328478 -7819712422949059337 -8562435516212387815 2064596134548104464 -6497839381664283351 -4433243247116178887 7515661444929089378 structs.go

Slide 123

Slide 123 text

structs.go

Slide 124

Slide 124 text

uint64: range: 0 through 18446744073709551615.

Slide 125

Slide 125 text

No content

Slide 126

Slide 126 text

MORE?

Slide 127

Slide 127 text

MORE? tour.golang.org

Slide 128

Slide 128 text

SETH VARGO @sethvargo THANK YOU!