Lightning talks




Rodrigo Hübner
O que têm?
●   Nova :)
●   Experimental ¬¬
●   Concorrente :D
●   Coletor de lixo ¬¬
●   Programação de Sistemas o/
●   Linguagem divertida e moderna
Maaais sobre o Compilador
●   Impressão de tipagem dinâmica em um sistema
    de tipo estático
    ●   Tipos são bem flexíveis
●   Existe métodos mas não NÃO é OO
●   Compilador 6g (ken)
    ●   Experimental, código ótimo e rápido, não liga GCC
●   Compilador gccgo (iant)
    ●   Tradicional, código bom e não tão rápido, liga GCC
Olá Mundo
package main
import "fmt"
func main() {
    fmt.Print("Hello, Worldn")
}
Variáveis e Estruturas de Controle
var a int
var b, c *int // note a diferença com C
var d []int
type S struct { a, b int }


if a == b { return true } else { return false }


for i = 0; i < 10; i++ { ... }
Algumas mudanças em relação a C
+x
23 + 3*x[i]
x <= f()
^a >> b
f() || g()
x == y + 1 && <­chan_ptr > 0
x &^ 7  // x com 3 bits baixos em 0
fmt.Printf("%5.2gn", 2*math.Sin(PI/8))
"hello" ", " "there" // concatenação léxica
"hello, " + str // concatenação dinâmica
Vamos melhorar
var (
    i int;
    j = 356.245;
    k int = 0;
    l, m uint64 = 1, 2;
    billion int64 = 1e9;
    inter, floater, stringer = 1, 2.0, "hi"
)
iota
const (
    Monday = iota;
    Tuesday = iota;
)
If aprimorado
if v := f(); v < 10 {
    fmt.Printf("%d less than 10n", v)
} else {
    fmt.Printf("%d not less than 10", v)
}




if n, err = fd.Write(buf); err != nil { ... }
for aprimorado
for i,j := 0,N; i < j; i,j = i+1,j­1 {...}
Switch-case
a, b := x[i], y[j];
switch {
    case a < b: return ­1
    case a == b: return 0
    case a > b: return 1
}
ou
switch a, b := x[i], y[j]; { ... }
Break ?
Loop: for i := 0; i < 10; i++ {
    switch f(i) {
        case 0, 1, 2: break Loop
    }
    g(i)
}
Funções e retornos

func MySqrt(f float) (v float, ok bool) {
    if f >= 0 { v,ok = math.Sqrt(f),true }
    return v,ok
}


func MySqrt(f float) (v float, ok bool) {
    if f >= 0 { v,ok = math.Sqrt(f),true }
    return // must be explicit
}


func MySqrt(f float) (v float, ok bool) {
    if f < 0 { return } // error case
    return math.Sqrt(f),true
}
defer
func f() {
    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }
}
// prints 4 3 2 1 0
Arrays e operações
func fp(a *[3]int) { fmt.Println(a) }
func main() {
    for i := 0; i < 3; i++ 
        fp(&[3]int{i, i*i, i*i*i})
    }
}
Saída:
&[0 0 0]
&[1 1 1]
&[2 4 8]


var ar = [10]int{0,1,2,3,4,5,6,7,8,9}
var a = &ar[5:7] // referencia → {5,6}
Maps
m = map[string]float { "1":1, "pi":3.1415 }
// Acessar um elemento como um valor
one := m["1"]
crash := m["not present"] // error
// Criar novos elementos e atualizá­los
m["2"] = 2;
m["2"] = 3;


// Em laço for
m := map[string]float { "1":1.0, "pi":3.1415 };
for key, value := range m {
    fmt.Printf("key %s, value %gn", key, value)
}
closures
func adder() (func(int) int) {
    var x int;
    return func(delta int) int {
        x += delta;
        return x
    }
}
var f = adder();
fmt.Print(f(1));
fmt.Print(f(20));
fmt.Print(f(300));


// Imprime 1 21 321
Bibliotecas
Paralelismo
var freeList = make(chan *Buffer, 100)
var serverChan = make(chan *Buffer)
func server() {
    for {
        b := <-serverChan; // wait for work
        process(b);
        ok := freeList <- b // reuse buffer if room
    }
}
func client() {
    for {
        b, ok := <-freeList; // grab one if available
        if !ok { b = new(Buffer) }
        load(b);
        serverChan <- b // send to server
    }
}
Mais

●   Métodos em structs
●   Interfaces
    ●   Many to many
●   Iterators e generators
●   http://golang.org/

Linguagem Go