Dotlenienie #11 #Go lang 101

22
© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone Dotlenienie #11 Go Lang 101 Paweł S. Piotrowski Dział Rozwoju i Architektury Grupa o2 / o2.pl Warszawa, 12.12.2013

Transcript of Dotlenienie #11 #Go lang 101

Page 1: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Dotlenienie #11 Go Lang 101

Paweł S. Piotrowski !!Dział Rozwoju i Architektury Grupa o2 / o2.pl !!Warszawa, 12.12.2013

Page 2: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Agenda

• Rys historyczny, skąd, dokąd i dlaczego tak?

• Cechy języka w pigułce

• Przykłady kodu

• „Struktury” danych

• Control flow

• Współbieżność - jak to ugryźć

• CSP

• Materiały

• Do czego?

• Hackaton

• Q&A!2

Page 3: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Rys historyczny, czyli dlaczego Go?

• Google i ich potrzeby - czy są takie unikalne? • Twórcy:

• Robert Griesemer • Rob Pike • Ken Thompson

• Czemu wykonywać rzeczy równolegle? Moore’s Law :( • subprocesy, wątki, GIL, mutexy, pamięć współdzielona.. brr! • korutyny / gorutyny FTW!

!3

Page 4: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Cechy języka

• kompilowany (ale szybko!) • silnie typowany • GC • nie ma bytecode - kod maszynowy • statycznie linkowany • concurrency primitives wbudowane w język (!)

!4

Page 5: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Instalacja

• sudo apt-get install golang • brew install go • windows: binarka / zip • export PATH=$PATH:/usr/local/go/bin • Sublime Text, vim - pluginy

!5

Page 6: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

!!!! Hello world!

Show me the code!

!6

Page 7: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

package main !import "fmt" import „github.com/codegangsta/martini" import "gitlab.projekty.lan/[grupa]/[repo].git" !func main() { fmt.Println(„Hello world") }

Przykłady kodu - hello

!7

Page 8: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

package main import "fmt" !func main() { var s string; s = "Grzegorz Brzęczyszczykiewicz" fmt.Println(s) } !// ale po co się tak męczyć.. var s string = „Grzegorz Brzęczyszczykiewicz” s := „Grzegorz Brzęczyszczykiewicz"

Przykłady kodu - zmienne

!8

Page 9: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

package main import "fmt" !func add(a, b int) int { return a + b } !func main() { fmt.Println( add(2,2) ) }

Przykłady kodu - funkcje

!9

Page 10: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

package main import "fmt" !func divMod(a, b int) (int, int) { return a / b, a % b } !func main() { div, mod := divMod(36, 12) fmt.Println("divMod(36, 12) ->", div, mod) ! _, i127mod12 := divMod(127, 12) fmt.Println("127 modulo 12 ->", i127mod12) !}

Przykłady kodu - funkcje

!10

Page 11: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

package main import "fmt" !type rectangle struct { x int y int } !func (r rectangle) area() int { return r.x * r.y } !func newRect(x, y int) rectangle { return rectangle{x:x, y:y} } !func main() { r := newRect(3,4) fmt.Println("rectangle: ", r) fmt.Println("rectangle area", r.area()) }

Struktury danych - struct

!11

Page 12: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

package main import "fmt" !func ptrIncr(iptr *int) { *iptr++ } !func nonPtrIncr(i int) { i++ } !func main() { i := 1 ptrIncr(&i) ! j := 1 nonPtrIncr(j) }

Struktury danych - wskaźniki

!12

Page 13: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

package main import "fmt" !type Rectangle struct { x int y int } !func (r *Rectangle) Area() int { return r.x * r.y } !func NewRect(x, y int) *Rectangle { return &Rectangle{x: x, y: y} } !type Figure interface { Area() int } !func printArea(f Figure) { fmt.Println("Fig przekazana do tej funkcji ma powierzchnię: ", f.Area()) } !func main() { r := NewRect(3, 4) printArea(r) }

Struktury danych - interfejsy

!13

Page 14: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Control flow - if, else, iterowanie (bez while!)

if a > b { .. } !if a > b { .. } else { .. } !it :=[]string{„Murzynek", "Bambo", „w”, „Afryce”, „mieszka”} for i := range(it) { fmt.Println(i, it[i]) } !m := map[string]int{"Murzynek": 1, "Bambo":2, „w”:3, „Afryce”:4, „Mieszka”:5 } for k, v := range(m) { fmt.Println(k, "=>", v) }

!14

Page 15: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Control flow - switch

switch a { case 1, 2: fmt.Println(„bla bla bla", a) case 3: //2 fmt.Println(„bla bla bla", a) default: fmt.Println(„default”, a) }

!15

Page 16: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Control flow - select (channel!)

ch := make(chan string) ch1 := make(chan time.Time) g := "hello" go fillChWithSmth(ch1) select { case e := <-ch: fmt.Println("Z kanału ch otrzymaliśmy wartość", e) case f := <-ch1: fmt.Println("Z kanału ch1 otrzymaliśmy wartość", f) case ch <- g: fmt.Println("Do kanału ch wysłaliśmy wartość", g) } !func fillChWithSmth(ch chan time.Time) { time.Sleep(10 * time.Second) ch <- time.Now() }

!16

Page 17: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Współbieżność - jak to ugryźć

• fork / subprocesy • wątki • GIL • node.js • Erlang • Scala • Communicating sequential processes (czyli Go!)

!17

Page 18: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Współbieżność - CSP a actor model

• Procesy CSP są anonimowe, Actor Model - identyfikuje uczestników

• CSP - rendezvous i brak buforowania; odbiorę jak będę gotowy vs asynchroniczność [ale można to modyfikować!]

• channel - ścieżka podana wprost vs komunikacja „do aktora” • http://en.wikipedia.org/wiki/

Communicating_sequential_processes • nie ma mutexów, shared memory - wysyłamy informacje do

kanałów a magia dzieje się pod spodem • Wbudowane w język (!) konstrukcje zapewniające

współbieżność: lekkie „procesy” (gorutyny), kanały (channels) oraz select

!18

Page 19: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Materiały

• https://gist.github.com/RafalFilipek/9335e3564b34ad878fd3 [channel]

• https://gist.github.com/cosmoz/024fdd399f327545ac87 [fb] • porównanie prędkości frameworków: http://

www.techempower.com/benchmarks/#section=data-r7&hw=i7&test=query

• http://golang.org.pl/ [kod na CC] • http://golang.org/ • http://tour.golang.org/ • Practical Go Programming: http://www.youtube.com/watch?

v=2-pPAvqyluI • Go for Python hackers: http://pyvideo.org/video/2345/go-for-

python-hackers-0

!19

Page 20: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Do czego?

• serwery - YES! • API - YES! • „frontend” dla aplikacji - YES • CMS hm..? • any ideas..? :)

Page 21: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Co dalej?

Q&A Let’s hack!

!21

Page 22: Dotlenienie #11  #Go lang 101

© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone

Dziekuję! :)