go ahead, make my day
DESCRIPTION
An introduction to the go programming language, emphasizing concurrency.TRANSCRIPT
![Page 1: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/1.jpg)
Go ahead, make my day.
Intro to Go programming language
![Page 2: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/2.jpg)
Me @torkale h8p://github.com/torkale torkale[at]gmail
![Page 3: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/3.jpg)
Why Go?
![Page 4: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/4.jpg)
Challenge
Safety & Performance Expressiveness
& Convenience
![Page 5: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/5.jpg)
AL
Mascot Performance Type safety Concurrency Scalability ProducKvity
![Page 6: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/6.jpg)
Respected Parents
Ken Thompson Unix, B, UTF-‐8, Plan 9 Rob Pike Plan 9, UTF-‐8, Limbo, Unix team The Unix Programming Environment The PracKce of Programming
![Page 7: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/7.jpg)
History
Start Late 2007
Public 2009
Go 1.0 March 2012
Go 1.1 May 2013
Rob Pike Ken Thompson
Robert Griesmer
![Page 8: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/8.jpg)
![Page 9: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/9.jpg)
Hello
package main import "fmt" func greet() {
fmt.Println("Hello, I love you, won’t you tell me your name?”) } func main() {
greet() }
![Page 10: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/10.jpg)
Web Server package main import ( "fmt" "net/h8p" ) func handler(w h8p.ResponseWriter, r *h8p.Request) { fmt.Fprine(w, ”Request from %s", r.URL.Path[1:]) } func main() { h8p.HandleFunc("/", handler) h8p.ListenAndServe(":8080", nil) }
![Page 11: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/11.jpg)
BASICS
Basic types DeclaraKons CondiKons Loops Slice Map
![Page 12: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/12.jpg)
Basic Types bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // alias for uint8 rune // alias for int32 // represents a Unicode code point float32 float64 complex64 complex128
![Page 13: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/13.jpg)
DeclaraKons var i int i = getInteger() j := getInteger() value, err := getValueOrError() value2, _ := getValueOrError()
![Page 14: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/14.jpg)
CondiKons var even bool if x%2 == 0 { even = true } if x%2 == 0 { even = true } else { even = false } if mod := x%2; mod == 0 { even = true }
![Page 15: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/15.jpg)
Loops factorial := 1 for i := 2; i <= num; i++ { factorial *= i } nextPowerOf2 := 1 for nextPowerOf2 < num { nextPowerOf2 *=2 } for { // Forever }
![Page 16: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/16.jpg)
Slice primes := []int{2, 3, 5, 7, 11, 13} fmt.Println("primes[1:4] ==", primes[1:4]) zeroes := make([]int, 5) fmt.Println("zeroes ==", zeroes) for i, v := range primes { fmt.Prine("(%d) = %d\n", i, v) } for _, v := range primes { fmt.Prine("%d\n", v) }
![Page 17: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/17.jpg)
Map m := make(map[string]int) m["Ten"] = 10 fmt.Println(m) capitals := map[string]string{ "Jerusalem": "Israel", "Paris": "France", "London": "UK", } fmt.Println(capitals) delete(capitals, "London") v, present := capitals["London"] fmt.Println("The capital:", v, "Present?", present)
![Page 18: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/18.jpg)
TYPES
Custom types Extension via composiKon Methods
![Page 19: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/19.jpg)
Custom Types type Name string type Person struct { first Name last Name } type Hero struct { Person power string } type Crowd struct { people []Person }
![Page 20: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/20.jpg)
Methods func (dude Person) FullName() string { return fmt.Sprine("%s %s", dude.first, dude.last) } func (dude Person) SetFirst(name Name) { dude.first = name } func (h *Hero) ToString() string { return fmt.Sprine("Name: %s Power: %s", h.FullName(), h.power) } func NewPerson(f, l Name) Person { return Person{f, l} }
![Page 21: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/21.jpg)
INTERFACES
AbstracKon Duck typing Signatures Implicit
![Page 22: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/22.jpg)
interfaces type Talker interface { Talk() string } func (dude Person) Talk() string { return fmt.Sprine("My name is %s", dude.FullName()) } func MakeSomeoneTalk(talker Talker) string { return talker.Talk() } func interfaces() { fmt.Println(MakeSomeoneTalk(NewPerson("Robert", "de Niro"))) }
![Page 23: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/23.jpg)
FUNCTIONS
Higher-‐order funcKons Custom funcKon types Closures MulKple return values
![Page 24: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/24.jpg)
FuncKons type PersonAcKon func(some Person) Name func (crowd Crowd) ConcatPersonAcKons(acKon PersonAcKon) string { var result string for _, dude := range crowd.people { result = fmt.Sprine("%s %s", result, acKon(dude)) } return result } func AllLastNames(crowd Crowd) string { return crowd.ConcatPersonAcKons(func(dude Person) Name { return dude.last }) }
![Page 25: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/25.jpg)
defer func MeasureStart(label string) (string, Kme.Time) { return label, Kme.Now() } func Measure(label string, startTime Kme.Time) { duraKon := Kme.Now().Sub(startTime) fmt.Println(label, "ComputaKon took", duraKon) } func benchmark() { defer Measure(MeasureStart("benchmark()")) Kme.Sleep(Kme.Second) }
![Page 26: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/26.jpg)
CONCURRENCY
CSP go-‐rouKne channels select
![Page 27: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/27.jpg)
CommunicaKng SequenKal Processes
“Do not communicate by sharing memory; instead share memory by communicaKng”
![Page 28: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/28.jpg)
go rouKnes var a string func Init() { a = "finally started" return } func doSomethingElse() { // … } func Simple() string{ go Init() doSomethingElse() return a }
![Page 29: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/29.jpg)
tradiKonal var ( a string wg sync.WaitGroup ) func Init() { defer wg.Done() a = "finally started" } func Simple() string{ wg.Add(1) go Init() wg.Wait() // do something else return a }
![Page 30: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/30.jpg)
channel package channel var ( a string ready chan bool ) func Init() { a = "finally started" ready <-‐ true } func Simple() string{ ready = make(chan bool) go Init() // do something else <-‐ready return a }
![Page 31: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/31.jpg)
Producer / Consumer func producer(c chan string){ defer close(c) for { work := getWork() c <-‐ work } } func consumer(c chan string) { for msg := range c { process(msg) } } func ProducerConsumer() { c := make(chan string) go producer(c) consumer(c) }
![Page 32: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/32.jpg)
Producer / Consumer func producer(c chan string){ defer close(c) for { work := getWork() c <-‐ work } } func consumer(c chan string, abort <-‐chan Kme.Time) { for { select { case msg := <-‐c: process(msg) case <-‐ abort: return } } } func ProducerConsumer() { c := make(chan string) go producer(c) abort := Kme.A|er(2*Kme.Second) consumer(c, abort) }
![Page 33: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/33.jpg)
Barber Shop Var seats = make(chan Customer, 2) customers := []Customer{ "Al", "Bob", "Chad", "Dave" } ) func barber() { for { c := <-‐seats fmt.Println("Barber shaving", c) } } func (c Customer) enter() { select { case seats <-‐ c: default: fmt.Println("Customer", c, "Leaves") } } func BarberShop() { go barber() for _, c := range customers { go c.enter() } }
![Page 34: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/34.jpg)
GO COMMAND
version build test get
install fmt … build -‐-‐race (1.1+)
![Page 35: Go ahead, make my day](https://reader033.vdocuments.mx/reader033/viewer/2022060107/5549cb1db4c9051c778b474c/html5/thumbnails/35.jpg)
h8p://golang.org/ h8p://tour.golang.org/ h8ps://code.google.com/p/go-‐wiki/wiki/Projects h8ps://groups.google.com/forum/#!forum/golang-‐nuts #go-‐nuts on irc.freenode.net h8ps://www.facebook.com/groups/golanggonuts