jdd2014: go! the one language you have to try in 2014 - andrzej grzesik

71
golang the one language you have to try in 2014

Upload: proidea

Post on 01-Jul-2015

72 views

Category:

Software


0 download

DESCRIPTION

You live and breathe http. Most of the things you do with a computer involve it. How many tiny little http-related utils have you already created? Is it time to stop? By no means, we all do it. I'd just like to encourage you to write the next one in Go. It's a fun little language, which feels like a cross-breed between C (pointers!) and ruby (concise, powerful syntax). But how much? Why, yet another language, but my perl/python/.. does all the things? Well, it does. But go has a few things that make it super sweet, is web-scale and real fun to use!

TRANSCRIPT

Page 1: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

golangthe one language you have to try in 2014

Page 2: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

golangthe one language you have to try in 2014

Page 3: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

Andrzej Grzesik!

!

!

@ags313

[email protected]

andrzejgrzesik.info

Page 4: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

about:me

Page 5: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

dev going deeper

Page 6: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

disclaimers

Page 7: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

my opinions are my own

Page 8: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

I hate computers

Page 9: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

questions?shoot!

Page 10: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

golang

Page 11: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

gopher

Page 12: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

free and open source

Page 13: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

BSD licensed

Page 14: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

comes from G

Page 15: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

FASTand I mean FAST

Page 16: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

tl;dr;C++ and ruby had a wild time

Page 17: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

play with it tonight

Page 18: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

so, why do I like go?

Page 19: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

no runtime dependencies!

Page 20: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

more pleasant than C

Page 21: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

go toolchain

Page 22: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

go command

Page 23: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

most important thing

Page 24: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

there is only one formatting

Page 25: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

package main!!

import "fmt"!!

func main() {!!fmt.Println("Hello world")!}!

Page 26: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

types

Page 27: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

types• uint8, uint16, uint32, uint64

• int8, int16, int32, int64

• float32, float64

• complex64, complex128

• byte alias for uint8

• rune alias for int32

• string

Page 28: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func program() {! var text! text = “zomg"! more := "zomg"!!

fmt.Println(len(text));!}!

Page 29: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

maps

Page 30: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func main() {! attendees := map[string]bool{! "Phil": true,! "Marcin": true,! }!!

fmt.Println(attendees["Phil"]) // true! fmt.Println(attendees["ags"]) // false! partygoers["ags"] = true! fmt.Println(attendees["ags"]) // true!}!

Page 31: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

structs

Page 32: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

type Rectangle struct {! a, b int32!}!!

func main() {! var rect Rectangle! rect = Rectangle{5, 10}! rect = Rectangle{a: 10, b: 5}!!

HasArea(s).Area()!}

Page 33: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

type Square struct {! side int32!}!!

func (sq Square) Area() int32 {! return sq.side * sq.side!}!!

func main() {! s := Square{16}! area := s.Area()!}

Page 34: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

interfaces

Page 35: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

type Square struct {! side int32!}!!

func (sq Square) Area() int32 {! return sq.side * sq.side!}!!

type HasArea interface {! Area() int32!}!!

func main() {! s := Square{16}! HasArea(s).Area()!}

Page 36: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

goroutineslightweight threads

Page 37: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func f(i int) {! amt := rand.Intn(1000)! time.Sleep(time.Duration(amt) * time.Millisecond)! fmt.Println(i)!}!!

func main() {! for i := 0; i < 3; i++ {! go f(i)! }! var input string! fmt.Scanln(&input)!}

Page 38: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

how many will run? runtime.GOMAXPROCS(4)

Page 39: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

channels

Page 40: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

channels

• communicate between funcs

• typed

• thread-safe

Page 41: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

channelschannel := make(chan int)!

Page 42: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

unbuffered channels

• sync

• will wait when empty

Page 43: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

buffered channelschannel := make(chan int, size)!

Page 44: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

buffered channels

• async

• return 0 element when empty

• will only wait when full

Page 45: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

basicschannel := make(chan int)!c <- a!!

<- c!!

a = <- c!!

a, ok = <- c!

Page 46: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func program() {! channel := make(chan int) !}!!

func from(connection chan int) {! connection <- rand.Intn(255)!}!!

func to(connection chan int) {! i := <- connection! fmt.Println(“much received", i)!}!

Page 47: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

but that’s not cool yet

Page 48: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

coordinate routines

Page 49: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func program() {! channel := make(chan int) !!

go func() {! close(channel)! // or! channel <- anything! }()!!

<- channel!}!

Page 50: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func program() {! latch := make(chan int) !!

go worker()! close(latch)!}!!

func worker() {! <- latch !}!

Page 51: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

generators

Page 52: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

id := make(chan int64)! go func() {! var counter int64 = 0! for {! id <- counter! counter += 1! } !}()

Page 53: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

multiple channels at once!

Page 54: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func program() {! select {! case a := <- channel!!

case b, mkay := other!!

case output <- z!!

default:! }!}!

Page 55: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

ranges

Page 56: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func fillIn(channel chan int) {! channel <- 1! channel <- 2! channel <- 4! close(channel)!}!!

func main() {! channel := make(chan int)! go fillIn(channel)!!

for s := range channel {! fmt.Printf("%d \n", s)! }!}

Page 57: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

packages

Page 58: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

[18:48][agrzesik@melmac:~/vcs/talks/go/hello]!$ find .!.!./bin!./bin/main!./pkg!./pkg/darwin_amd64!./pkg/darwin_amd64/hello.a!./src!./src/hello!./src/hello/hello.go!./src/main!./src/main/.main.go.swp!./src/main/main.go!

Page 59: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

import (! "code.google.com/p/go.net/websocket"! "fmt"! "net/http"!)!

Page 60: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

go get

Page 61: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

net

Page 62: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

echo server

Page 63: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

const listenAddr = "localhost:4000"!!

func main() {! l, err := net.Listen("tcp", listenAddr)! if err != nil {! log.Fatal(err)! }! for {! c, err := l.Accept()! if err != nil {! log.Fatal(err)! }! io.Copy(c, c)! }!}

Page 64: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

concurrent echo server

Page 65: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

const listenAddr = "localhost:4000"!!

func main() {! l, err := net.Listen("tcp", listenAddr)! if err != nil {! log.Fatal(err)! }! for {! c, err := l.Accept()! if err != nil {! log.Fatal(err)! }! go io.Copy(c, c)! }!}

Page 66: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

const listenAddr = "localhost:4000"!!

func main() {! l, err := net.Listen("tcp", listenAddr)! if err != nil {! log.Fatal(err)! }! for {! c, err := l.Accept()! if err != nil {! log.Fatal(err)! }! io.Copy(c, c)! }!}

Page 67: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

websockets?

Page 68: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

func main() {! http.Handle("/", websocket.Handler(handler))! http.ListenAndServe("localhost:1984", nil)!}!!

func handler(c *websocket.Conn) {! var s string! fmt.Fscan(c, &s)! fmt.Println("Received:", s)! fmt.Fprint(c, “hey!”)!}!

Page 69: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

so, what looks bad?

Page 70: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

type AssetMetas struct {!!Metas []AssetMeta `json:"assetMetas"`! }!!

type AssetMeta struct {!!ResourceName string `json:"resource_name"`! !Md5 string `json:"md5"`! !Urls []string `json:"urls"`! }!

Page 71: JDD2014: GO! The one language you have to try in 2014 - Andrzej Grzesik

so, go code!