Upload
pawel-s-piotrowski
View
366
Download
2
Embed Size (px)
Citation preview
© 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
© 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
© 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
© 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
© 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
© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone
!!!! Hello world!
Show me the code!
!6
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone
Do czego?
• serwery - YES! • API - YES! • „frontend” dla aplikacji - YES • CMS hm..? • any ideas..? :)
© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone
Co dalej?
Q&A Let’s hack!
!21
© 2013 o2 sp. z o.o. Wszelkie prawa zastrzeżone
Dziekuję! :)