Slide 1

Slide 1 text

Introdução a linguagem Go Allisson Azevedo http://allissonazevedo.com FLISol Campina Grande 2015

Slide 2

Slide 2 text

História • 2007 - Design • Robert Griesemer (HotSpot/V8) • Rob Pike (Unix/UTF-8) • Ken Thompson (Unix/UTF-8/B e C) • 2009 - Open Source • http://golang.org/doc/faq#history

Slide 3

Slide 3 text

Características • Compilada • Tipagem estática • Sintaxe simples • Visibilidade pela primeira letra do símbolo • Concorrência (Goroutines) • Garbage collector • Ótima biblioteca padrão

Slide 4

Slide 4 text

The Gopher

Slide 5

Slide 5 text

Quem esta usando? https://speakerdeck.com/ftmamud/golang

Slide 6

Slide 6 text

Por onde iniciar? • http://golang.org/doc/install • http://tour.golang.org/ • http://play.golang.org/ • http://www.golang-book.com/ • http://www.golangbootcamp.com/

Slide 7

Slide 7 text

Hello World // Definição do pacote package main // Import do pacote fmt import "fmt" // Definição da função main func main() { // Executa a função Println do pacote fmt fmt.Println("Hello World") }

Slide 8

Slide 8 text

Variavéis package main import "fmt" var nome string func main() { nome = "Allisson" fmt.Println("Olá " + nome) // retorna Olá Allisson }

Slide 9

Slide 9 text

Variavéis package main import "fmt" var nome string = "Allisson" func main() { fmt.Println("Olá " + nome) // retorna Olá Allisson }

Slide 10

Slide 10 text

Variavéis package main import "fmt" var nome = "Allisson" func main() { fmt.Println("Olá " + nome) // retorna Olá Allisson }

Slide 11

Slide 11 text

Variavéis package main import "fmt" func main() { nome := "Allisson" fmt.Println("Olá " + nome) // retorna Olá Allisson }

Slide 12

Slide 12 text

Variavéis package main import "fmt" var ( nome = "Allisson" sobrenome = "Azevedo" ) func main() { fmt.Println("Olá " + nome + " " + sobrenome) // retorna Olá Allisson Azevedo }

Slide 13

Slide 13 text

Variavéis package main import "fmt" var ( nome, sobrenome = "Allisson", "Azevedo" ) func main() { fmt.Println("Olá " + nome + " " + sobrenome) // retorna Olá Allisson Azevedo }

Slide 14

Slide 14 text

Variavéis package main import "fmt" var ( nome, sobrenome = "Allisson", "Azevedo" idade = 32 ) func main() { fmt.Println("Olá " + nome + " " + sobrenome) // retorna Olá Allisson Azevedo fmt.Println(32) // retorna 32 }

Slide 15

Slide 15 text

Constantes package main import "fmt" const Pi = 3.14 const ( StatusOK = 200 StatusNotFound = 404 ) func main() { fmt.Println(Pi) // retorna 3.14 fmt.Println(StatusOK) // retorna 200 fmt.Println(StatusNotFound) // retorna 404 }

Slide 16

Slide 16 text

Pacotes e Imports package main import "fmt" import "log" func main() { log.Println("Iniciando o programa") fmt.Println("Hello World") }

Slide 17

Slide 17 text

Pacotes e Imports package main import ( "fmt" "log" ) func main() { log.Println("Iniciando o programa") fmt.Println("Hello World") }

Slide 18

Slide 18 text

Pacotes e Imports package main // go get code.google.com/p/go-uuid/uuid import ( "code.google.com/p/go-uuid/uuid" "fmt" "log" ) func main() { log.Println("Iniciando o programa") fmt.Println("Hello World") fmt.Println(uuid.NewRandom()) }

Slide 19

Slide 19 text

Funções package main import "fmt" func soma(x, y int) int { return x + y } func main() { fmt.Print("2 + 2 = ") fmt.Println(soma(2, 2)) }

Slide 20

Slide 20 text

Funções package main import ( "fmt" "strings" ) func nomeSobrenome(nome string) (string, string) { return strings.Split(nome, " ")[0], strings.Split(nome, " ")[1] } func main() { nome, sobrenome := nomeSobrenome("Allisson Azevedo") fmt.Println("Nome = " + nome) fmt.Println("Sobrenome = " + sobrenome) }

Slide 21

Slide 21 text

Funções package main import ( "fmt" "strings" ) func nomeSobrenome(nomeCompleto string) (nome, sobrenome string) { nome = strings.Split(nomeCompleto, " ")[0] sobrenome = strings.Split(nomeCompleto, " ")[1] return } func main() { nome, sobrenome := nomeSobrenome("Allisson Azevedo") fmt.Println("Nome = " + nome) fmt.Println("Sobrenome = " + sobrenome) }

Slide 22

Slide 22 text

Ponteiros package main import "fmt" func main() { a := 10 b := a c := &a b = 20 *c = 30 fmt.Println(a) // retorna 30 fmt.Println(b) // retorna 20 fmt.Println(*c) // retorna 30 }

Slide 23

Slide 23 text

Ponteiros package main import "fmt" func zera1(valor int) { valor = 0 } func zera2(valor *int) { *valor = 0 } func main() { valor := 10 zera1(valor) fmt.Println(valor) // retorna 10 zera2(&valor) fmt.Println(valor) // retorna 0 }

Slide 24

Slide 24 text

Structs package main import "fmt" type Pessoa struct { Nome string Idade int } func main() { pessoa := Pessoa{Nome: "Fulano", Idade: 1} fmt.Println(pessoa.Nome) fmt.Println(pessoa.Idade) allisson := &pessoa allisson.Nome = "Allisson" allisson.Idade = 32 fmt.Println(pessoa.Nome) fmt.Println(pessoa.Idade) }

Slide 25

Slide 25 text

Structs package main import "fmt" type Numero struct { X int } func (n Numero) Dobro() int { n.X = n.X * 2 return n.X } func (n *Numero) Dobro2() int { n.X = n.X * 2 return n.X } func main() { numero := Numero{X: 10} fmt.Println(numero.Dobro()) fmt.Println(numero.X) fmt.Println(numero.Dobro2()) fmt.Println(numero.X) }

Slide 26

Slide 26 text

Structs package main import "fmt" type Pessoa struct { Nome string } type Funcionario struct { Pessoa Mat int } func main() { funcionario := Funcionario{} funcionario.Nome = "Allisson" funcionario.Mat = 12345 fmt.Println(funcionario.Nome) fmt.Println(funcionario.Mat) }

Slide 27

Slide 27 text

Structs package main import "fmt" type Pessoa struct { Nome string } type Funcionario struct { Pessoa Mat int } func main() { funcionario := Funcionario{Pessoa{Nome: "Allisson"}, 12345} fmt.Println(funcionario.Nome) fmt.Println(funcionario.Mat) }

Slide 28

Slide 28 text

Interfaces package main import "fmt" type FiguraGeometrica interface { area() int } type Quadrado struct { Lado int } func (q Quadrado) area() int { return q.Lado * 2 } type Retangulo struct { Comprimento, Largura int } func (r Retangulo) area() int { return r.Comprimento * r.Largura } func CalculaArea(f FiguraGeometrica) { fmt.Println(f.area()) } func main() { quadrado := Quadrado{Lado: 5} retangulo := Retangulo{Comprimento: 5, Largura: 10} CalculaArea(quadrado) CalculaArea(retangulo) }

Slide 29

Slide 29 text

Tratamento de erros package main import ( "fmt" "io/ioutil" "log" ) func main() { file, err := ioutil.ReadFile("arquivo.invalido") if err != nil { log.Fatal(err) } fmt.Println(string(file)) }

Slide 30

Slide 30 text

Tratamento de erros package main import ( "errors" "fmt" "log" ) func Dividir(x, y int) (int, error) { if y == 0 { return 0, errors.New("Proibida divisão por zero.") } return x / y, nil } func main() { valor, err := Dividir(10, 0) if err != nil { log.Fatal(err) } fmt.Println(valor) }

Slide 31

Slide 31 text

Defer package main import "fmt" func main() { defer fmt.Println("World") fmt.Println("Hello") }

Slide 32

Slide 32 text

Defer package main import ( "log" "os" ) func main() { file, err := os.Create("teste.txt") if err != nil { log.Fatal(err) } defer file.Close() file.WriteString("Teste do defer") }

Slide 33

Slide 33 text

Slices package main import "fmt" func main() { alunos := make([]string, 3) fmt.Println(alunos) alunos[0] = "Fulano" alunos[1] = "Beltrano" alunos[2] = "Cicrano" fmt.Println(alunos) alunos = append(alunos, "Zezinho") fmt.Println(alunos) fmt.Println(alunos[2:4]) }

Slide 34

Slide 34 text

Range package main import "fmt" func main() { alunos := make([]string, 3) alunos[0] = "Fulano" alunos[1] = "Beltrano" alunos[2] = "Cicrano" for i, value := range alunos { fmt.Println("Posição:", i, "Valor:", value) } }

Slide 35

Slide 35 text

Maps package main import "fmt" func main() { m := make(map[string]int) m["Allisson"] = 32 m["Chuck Norris"] = 75 fmt.Println(m["Allisson"]) fmt.Println(m["Chuck Norris"]) }

Slide 36

Slide 36 text

Maps package main import "fmt" func main() { m := map[string]int{ "Allisson": 32, "Chuck Norris": 75, } fmt.Println(m["Allisson"]) fmt.Println(m["Chuck Norris"]) }

Slide 37

Slide 37 text

Maps package main import "fmt" func main() { m := make(map[string]int) m["Teste"] = 30 fmt.Println("O valor é:", m["Teste"]) m["Teste"] = 31 fmt.Println("O valor é:", m["Teste"]) delete(m, "Teste") fmt.Println("O valor é:", m["Teste"]) _, ok := m["Teste"] if ok == false { fmt.Println("O valor Teste não existe") } }

Slide 38

Slide 38 text

Maps package main import "fmt" func main() { m := make(map[string]int) m["Allisson"] = 32 m["Chuck Norris"] = 75 for k, v := range m { fmt.Println("Chave:", k, "Valor:", v) } }

Slide 39

Slide 39 text

Goroutines package main import ( "fmt" "time" ) func digaoi(s string) { fmt.Println("Dizendo oi de:", s) } func main() { go digaoi("Goroutine") digaoi("Normal") time.Sleep(100 * time.Millisecond) }

Slide 40

Slide 40 text

Goroutines package main import ( "fmt" "io/ioutil" "log" "net/http" "time" ) func fetch(s string) { res, err := http.Get(s) if err != nil { log.Println("Não foi possível conectar com a url", s) return } body, err := ioutil.ReadAll(res.Body) fmt.Println("A página:", s, "Tem o tamanho de:", len(string(body))) } func main() { go fetch("http://www.google.com.br") fetch("http://www.uol.com.br") time.Sleep(5000 * time.Millisecond) }

Slide 41

Slide 41 text

Goroutines package main import ( "fmt" "io/ioutil" "log" "net/http" ) func fetch(s string, channel chan string) { res, err := http.Get(s) if err != nil { log.Println("Não foi possível conectar com a url", s) return } body, err := ioutil.ReadAll(res.Body) result := fmt.Sprintf("A página: %s, Tem o tamanho de %d", s, len(string(body))) channel <- result } func main() { channel := make(chan string) go fetch("http://linuxmint.com/", channel) go fetch("http://www.ubuntu.com/", channel) go fetch("http://www.debian.org/", channel) go fetch("http://www.opensuse.org/en/", channel) go fetch("http://getfedora.org/", channel) for i := 0; i < 5; i++ { fmt.Println(<-channel) } }

Slide 42

Slide 42 text

HTTP Server package main import ( "io" "net/http" ) func index(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello world!") } func main() { http.HandleFunc("/", index) http.ListenAndServe(":8080", nil) }

Slide 43

Slide 43 text

Mais exemplos • Thumbnail server • Static http server • Gogs.io

Slide 44

Slide 44 text

Obrigado!