SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
Go
Imperativa, Estruturada e Concorrente
Introdução
História
Motivação
Características
História
▪ Google ― 2009
▪ Open Source
▪ A lenda
▪ Compilador Experimental
▪ V1.0 ― 2012
Rob Pike Ken ThompsonRobert Griesemer
Motivação
▪ Frustração com linguagens e
ambientes existentes
▪ Compilação eficiente ou execução
eficiente ou facilidade de
programação
▪ Objetivos simples:
▫ ter a rapidez do C
▫ ser mais legível
▫ programadores mais produtivos
Características
▪ Garbage Collector
▪ Compila muito rápido
▪ Incrivelmente ‘leve’ em
termos de uso de memória
▪ Muito boa para programas
concorrentes
Nomenclatura
Nomenclatura
▪ A sintaxe é descrita usando EBNF
▪ 25 palavras-chave
▪ Nome antes de tipo
▪ Ponteiros (semelhante à C)
▫ Porém, sem aritmética
▪ Escopo estático
▫ Pacote, Função, For
▫ Bloco podem ser aninhados
Nomenclatura
▪ Visibilidade (diferentes pacotes)
▫ Nomes iniciados com
■ Maiúscula: são públicos
■ minúscula: são privados
▪ Não permite sobrecarga
▪ Ponto e vírgula invisível
Tipagem
Tipagem
▪ Tipagem estática
▪ Fortemente tipada
▪ Equivalência de tipos
▫ Equivalência de nome, não há
equivalência estrutural
Parece tipagem dinâmica
var x int = 5
var x = 5
x := 5
Tipagem
Tipos básicos:
▫ bool
▫ string
▫ int int8 int16 int32 int64
▫ uint uint8 uint16 uint32 uint64 uintptr
▫ byte (pseudônimo para uint8)
▫ rune (pseudônimo para int32)
(ponto de código Unicode)
▫ float32 float64
▫ complex64 complex128
Tipagem
▪ Tipos compostos
▫ Ponteiros
■ &(endereço de) e *(desreferenciação)
▫ Structs
■ Pode ser recursivo
▫ Matrizes
■ Não podem ser redimensionadas
▫ Slices
■ Dinamicamente redimensionada
■ Referência para matriz
Tipagem
▪ Tipos compostos
▫ Maps
▫ Interfaces
■ Conjunto de funções
▫ Funções
■ Mesmos parâmetros e mesmo tipo de
retorno
▫ Canais
■ Mecanismo para comunicação de
funções concorrentes
Funções
e algo mais...
Funções
▪ Go possui:
▫ Funções
▫ Procedimentos
▫ Métodos
▪ Passagem de parâmetro
▫ Padrão: por valor
▫ Por referência somente com ponteiro
Principais áreas de uso do GO
● Aplicações de Servidor
● Big Data
● Processamento de Imagem
● Núcleo de apps Web complexos
● Criptografia
Não possui
● Tratamento de exceção
● Herança de tipos
● Programação genérica
● Asserções
● Conversão numérica implícita
● Ternários (expressão ? uma coisa : outra coisa)
● Compilação com variáveis ou
importações não utilizadas
Mini-tutorial
Estruturas de Controle
Sem Parênteses
for i := 0; i < 10; i++ {
soma += i
}
if x < 0 {
return sqrt(-x) + "i"
}
Estruturas de Controle
Sem DO
Sem WHILE
func main() {
soma := 1
for soma < 1000 {
soma += soma
} // for é o while de Go
fmt.Println(soma)
}
Estruturas de Controle
IF e SWITCH aceitam instrução de
inicialização
if v := math.Pow(x, n); v<10 {
return v
}
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
Estruturas de Controle
Rótulo em BREAK e CONTINUE
busca:
for i := 0; i < len(tabuleiro); i++ {
for j := 0; j < len(tabuleiro[i]); j++ {
if (tabuleiro[i][j] == 9) {
Println("Achou bomba na linha ", i+1);
break busca;
}
}
}
Matrizes
func main() {
var a [2]string
a[0] = "Hello"
a[1] = "World"
fmt.Println(a[0], a[1])
fmt.Println(a)
primos := [6]int{2, 3, 5, 7, 11, 13}
fmt.Println(primos)
}
Slices
func main() {
primos := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primos[1:4]
fmt.Println(s)
}
Interfaces e “Polimorfismo”
type Funcionário interface {
Id()
}
type Pessoa struct {
Nome string
}
//Esse método diz que o tipo T
//implementa a interface I,
//mas não precisamos explicitamente
//declarar isso
func (p Pessoa) Id() {
fmt.Println(p.Nome)
}
func main() {
var f Funcionário =
Pessoa{"hello"}
f.Id()
}
Outros detalhes
Funções com múltiplos retornos
func troca(x, y string) (string, string) {
return y, x
}
func main() {
a, b := troca("hello", "world")
fmt.Println(a, b)
}
Outros detalhes
Funções de primeira-classe
package main
import (
"fmt"
)
type StringFoo func() string
func ok() string{
return "tá OK"
}
func pegaUmaFuncao(foo StringFoo){
fmt.Printf("função foo retorna:
%vn", foo())
}
func main(){
pegaUmaFuncao(ok)
}
Outros detalhes
Funções variádicas
func soma(nums ...int) {
fmt.Print(nums, " ")
total := 0
for _, num := range nums {
total += num
}
fmt.Println(total)
}
func main() {
soma(1, 2)
soma(1, 2, 3)
nums := []int{1, 2, 3, 4}
soma(nums...)
}
Concorrência
▪ Goroutines
package main
import (
"fmt"
"time"
)
func dizer(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100*time.Millisecond)
fmt.Println(s)
}
}
func main() {
go dizer("world")
dizer("hello")
}
Concorrência
▪ Channels
package main
import "fmt"
func soma(s []int, c chan int) {
soma := 0
for _, v := range s {
soma += v
}
c <- soma //manda soma para c
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go soma(s[:len(s)/2], c)
go soma(s[len(s)/2:], c)
x, y := <-c, <-c // recebe de c
fmt.Println(x, y, x+y)
}
Obrigado!
Dúvidas?

Mais conteúdo relacionado

Mais procurados (15)

Funções em C
Funções em CFunções em C
Funções em C
 
Javascript
Javascript Javascript
Javascript
 
Zope
ZopeZope
Zope
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
 
Filas encadeadas
Filas encadeadasFilas encadeadas
Filas encadeadas
 
Lp m2(parte4)
Lp m2(parte4)Lp m2(parte4)
Lp m2(parte4)
 
Linguagem C 09 Ponteiros
Linguagem C 09 PonteirosLinguagem C 09 Ponteiros
Linguagem C 09 Ponteiros
 
OOP (in portuguese)
OOP (in portuguese)OOP (in portuguese)
OOP (in portuguese)
 
Light Talk sobre JavaScript Funcional
Light Talk sobre JavaScript FuncionalLight Talk sobre JavaScript Funcional
Light Talk sobre JavaScript Funcional
 
Pipeline desdobramento escalonamento
Pipeline desdobramento escalonamentoPipeline desdobramento escalonamento
Pipeline desdobramento escalonamento
 
Aula5 introducao c
Aula5 introducao cAula5 introducao c
Aula5 introducao c
 
Aula5 introducao c
Aula5 introducao cAula5 introducao c
Aula5 introducao c
 
Maratona de Programação com STL
Maratona de Programação com STLMaratona de Programação com STL
Maratona de Programação com STL
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Programacao funcional
Programacao funcionalProgramacao funcional
Programacao funcional
 

Semelhante a Go: Imperativa, Estruturada e Concorrente

Curso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação CCurso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação CJoberthSilva
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaSérgio Souza Costa
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem Capolllorj
 
Estrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptxEstrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptxMarceloRosenbrock1
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao rubyFrancis Wagner
 
Iniciando com javaScript 2017
Iniciando com javaScript 2017Iniciando com javaScript 2017
Iniciando com javaScript 2017Romualdo Andre
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2Elvis Araújo
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3klaussilveira
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
javascript_funcional.pdf
javascript_funcional.pdfjavascript_funcional.pdf
javascript_funcional.pdfronaldo ramos
 

Semelhante a Go: Imperativa, Estruturada e Concorrente (20)

Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf
 
Curso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação CCurso Completo de Linguagem de Programação C
Curso Completo de Linguagem de Programação C
 
Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
 
Go
Go Go
Go
 
Tdc2010 web
Tdc2010 webTdc2010 web
Tdc2010 web
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo Lua
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem C
 
Estrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptxEstrutura de linguagem de programação - Aula 2.pptx
Estrutura de linguagem de programação - Aula 2.pptx
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Curso de introdução ao ruby
Curso de introdução ao rubyCurso de introdução ao ruby
Curso de introdução ao ruby
 
Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001
 
Iniciando com javaScript 2017
Iniciando com javaScript 2017Iniciando com javaScript 2017
Iniciando com javaScript 2017
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Qual linguagem escolher?
Qual linguagem escolher?Qual linguagem escolher?
Qual linguagem escolher?
 
Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
javascript_funcional.pdf
javascript_funcional.pdfjavascript_funcional.pdf
javascript_funcional.pdf
 

Mais de Marcos Paulo Maia dos Santos

Inclusão Digital - Conceitos básicos de informática
Inclusão Digital - Conceitos básicos de informáticaInclusão Digital - Conceitos básicos de informática
Inclusão Digital - Conceitos básicos de informáticaMarcos Paulo Maia dos Santos
 
Linguagens não recursivamente enumeráveis e Hierarquia de Chomsky
Linguagens não recursivamente enumeráveis e Hierarquia de ChomskyLinguagens não recursivamente enumeráveis e Hierarquia de Chomsky
Linguagens não recursivamente enumeráveis e Hierarquia de ChomskyMarcos Paulo Maia dos Santos
 
Regressão simbólica - Resolvendo problemas de planejamento não-determinísticos
Regressão simbólica - Resolvendo problemas de planejamento não-determinísticosRegressão simbólica - Resolvendo problemas de planejamento não-determinísticos
Regressão simbólica - Resolvendo problemas de planejamento não-determinísticosMarcos Paulo Maia dos Santos
 
Problema da Árvore Geradora de Rotulação Mínima (PAGRM)
Problema da Árvore Geradora de Rotulação Mínima (PAGRM)Problema da Árvore Geradora de Rotulação Mínima (PAGRM)
Problema da Árvore Geradora de Rotulação Mínima (PAGRM)Marcos Paulo Maia dos Santos
 
Applied plotting, charting & data representation in Python (pt. 2)
Applied plotting, charting & data representation in Python (pt. 2)Applied plotting, charting & data representation in Python (pt. 2)
Applied plotting, charting & data representation in Python (pt. 2)Marcos Paulo Maia dos Santos
 

Mais de Marcos Paulo Maia dos Santos (11)

Inclusão Digital - Conceitos básicos de informática
Inclusão Digital - Conceitos básicos de informáticaInclusão Digital - Conceitos básicos de informática
Inclusão Digital - Conceitos básicos de informática
 
Linguagens não recursivamente enumeráveis e Hierarquia de Chomsky
Linguagens não recursivamente enumeráveis e Hierarquia de ChomskyLinguagens não recursivamente enumeráveis e Hierarquia de Chomsky
Linguagens não recursivamente enumeráveis e Hierarquia de Chomsky
 
Regressão simbólica - Resolvendo problemas de planejamento não-determinísticos
Regressão simbólica - Resolvendo problemas de planejamento não-determinísticosRegressão simbólica - Resolvendo problemas de planejamento não-determinísticos
Regressão simbólica - Resolvendo problemas de planejamento não-determinísticos
 
Problema da Árvore Geradora de Rotulação Mínima (PAGRM)
Problema da Árvore Geradora de Rotulação Mínima (PAGRM)Problema da Árvore Geradora de Rotulação Mínima (PAGRM)
Problema da Árvore Geradora de Rotulação Mínima (PAGRM)
 
Introdução a ciência de dados com Python
Introdução a ciência de dados com PythonIntrodução a ciência de dados com Python
Introdução a ciência de dados com Python
 
Applied plotting, charting & data representation in Python (pt. 2)
Applied plotting, charting & data representation in Python (pt. 2)Applied plotting, charting & data representation in Python (pt. 2)
Applied plotting, charting & data representation in Python (pt. 2)
 
Resolução de problemas por meio de busca
Resolução de problemas por meio de buscaResolução de problemas por meio de busca
Resolução de problemas por meio de busca
 
Planejamento em Inteligência Artificial
Planejamento em Inteligência ArtificialPlanejamento em Inteligência Artificial
Planejamento em Inteligência Artificial
 
Planejamento como verificação de modelos
Planejamento como verificação de modelosPlanejamento como verificação de modelos
Planejamento como verificação de modelos
 
Diagramas de decisão binária
Diagramas de decisão bináriaDiagramas de decisão binária
Diagramas de decisão binária
 
Planejamento em Inteligência Artificial
Planejamento em Inteligência ArtificialPlanejamento em Inteligência Artificial
Planejamento em Inteligência Artificial
 

Go: Imperativa, Estruturada e Concorrente

  • 3. História ▪ Google ― 2009 ▪ Open Source ▪ A lenda ▪ Compilador Experimental ▪ V1.0 ― 2012 Rob Pike Ken ThompsonRobert Griesemer
  • 4. Motivação ▪ Frustração com linguagens e ambientes existentes ▪ Compilação eficiente ou execução eficiente ou facilidade de programação ▪ Objetivos simples: ▫ ter a rapidez do C ▫ ser mais legível ▫ programadores mais produtivos
  • 5. Características ▪ Garbage Collector ▪ Compila muito rápido ▪ Incrivelmente ‘leve’ em termos de uso de memória ▪ Muito boa para programas concorrentes
  • 7. Nomenclatura ▪ A sintaxe é descrita usando EBNF ▪ 25 palavras-chave ▪ Nome antes de tipo ▪ Ponteiros (semelhante à C) ▫ Porém, sem aritmética ▪ Escopo estático ▫ Pacote, Função, For ▫ Bloco podem ser aninhados
  • 8. Nomenclatura ▪ Visibilidade (diferentes pacotes) ▫ Nomes iniciados com ■ Maiúscula: são públicos ■ minúscula: são privados ▪ Não permite sobrecarga ▪ Ponto e vírgula invisível
  • 10. Tipagem ▪ Tipagem estática ▪ Fortemente tipada ▪ Equivalência de tipos ▫ Equivalência de nome, não há equivalência estrutural Parece tipagem dinâmica var x int = 5 var x = 5 x := 5
  • 11. Tipagem Tipos básicos: ▫ bool ▫ string ▫ int int8 int16 int32 int64 ▫ uint uint8 uint16 uint32 uint64 uintptr ▫ byte (pseudônimo para uint8) ▫ rune (pseudônimo para int32) (ponto de código Unicode) ▫ float32 float64 ▫ complex64 complex128
  • 12. Tipagem ▪ Tipos compostos ▫ Ponteiros ■ &(endereço de) e *(desreferenciação) ▫ Structs ■ Pode ser recursivo ▫ Matrizes ■ Não podem ser redimensionadas ▫ Slices ■ Dinamicamente redimensionada ■ Referência para matriz
  • 13. Tipagem ▪ Tipos compostos ▫ Maps ▫ Interfaces ■ Conjunto de funções ▫ Funções ■ Mesmos parâmetros e mesmo tipo de retorno ▫ Canais ■ Mecanismo para comunicação de funções concorrentes
  • 15. Funções ▪ Go possui: ▫ Funções ▫ Procedimentos ▫ Métodos ▪ Passagem de parâmetro ▫ Padrão: por valor ▫ Por referência somente com ponteiro
  • 16. Principais áreas de uso do GO ● Aplicações de Servidor ● Big Data ● Processamento de Imagem ● Núcleo de apps Web complexos ● Criptografia
  • 17. Não possui ● Tratamento de exceção ● Herança de tipos ● Programação genérica ● Asserções ● Conversão numérica implícita ● Ternários (expressão ? uma coisa : outra coisa) ● Compilação com variáveis ou importações não utilizadas
  • 19. Estruturas de Controle Sem Parênteses for i := 0; i < 10; i++ { soma += i } if x < 0 { return sqrt(-x) + "i" }
  • 20. Estruturas de Controle Sem DO Sem WHILE func main() { soma := 1 for soma < 1000 { soma += soma } // for é o while de Go fmt.Println(soma) }
  • 21. Estruturas de Controle IF e SWITCH aceitam instrução de inicialização if v := math.Pow(x, n); v<10 { return v } switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux": fmt.Println("Linux.") default: // freebsd, openbsd, // plan9, windows... fmt.Printf("%s.", os) }
  • 22. Estruturas de Controle Rótulo em BREAK e CONTINUE busca: for i := 0; i < len(tabuleiro); i++ { for j := 0; j < len(tabuleiro[i]); j++ { if (tabuleiro[i][j] == 9) { Println("Achou bomba na linha ", i+1); break busca; } } }
  • 23. Matrizes func main() { var a [2]string a[0] = "Hello" a[1] = "World" fmt.Println(a[0], a[1]) fmt.Println(a) primos := [6]int{2, 3, 5, 7, 11, 13} fmt.Println(primos) }
  • 24. Slices func main() { primos := [6]int{2, 3, 5, 7, 11, 13} var s []int = primos[1:4] fmt.Println(s) }
  • 25. Interfaces e “Polimorfismo” type Funcionário interface { Id() } type Pessoa struct { Nome string } //Esse método diz que o tipo T //implementa a interface I, //mas não precisamos explicitamente //declarar isso func (p Pessoa) Id() { fmt.Println(p.Nome) } func main() { var f Funcionário = Pessoa{"hello"} f.Id() }
  • 26. Outros detalhes Funções com múltiplos retornos func troca(x, y string) (string, string) { return y, x } func main() { a, b := troca("hello", "world") fmt.Println(a, b) }
  • 27. Outros detalhes Funções de primeira-classe package main import ( "fmt" ) type StringFoo func() string func ok() string{ return "tá OK" } func pegaUmaFuncao(foo StringFoo){ fmt.Printf("função foo retorna: %vn", foo()) } func main(){ pegaUmaFuncao(ok) }
  • 28. Outros detalhes Funções variádicas func soma(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums { total += num } fmt.Println(total) } func main() { soma(1, 2) soma(1, 2, 3) nums := []int{1, 2, 3, 4} soma(nums...) }
  • 29. Concorrência ▪ Goroutines package main import ( "fmt" "time" ) func dizer(s string) { for i := 0; i < 5; i++ { time.Sleep(100*time.Millisecond) fmt.Println(s) } } func main() { go dizer("world") dizer("hello") }
  • 30. Concorrência ▪ Channels package main import "fmt" func soma(s []int, c chan int) { soma := 0 for _, v := range s { soma += v } c <- soma //manda soma para c } func main() { s := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go soma(s[:len(s)/2], c) go soma(s[len(s)/2:], c) x, y := <-c, <-c // recebe de c fmt.Println(x, y, x+y) }