SlideShare uma empresa Scribd logo
1 de 83
Baixar para ler offline
Paradigmas de Linguagens de
       Programação




                 Delano Oliveira
                 Janderson Jason
                  Luan Barbosa
                    Natã Melo

 {delanoho, jandersonjba, luanbg, natavm}@lcc.ufcg.edu.br
Agenda
   Introdução
   Valores e Tipos
   Armazenamento
   Associações
   Abstrações
   Unidades de Programa
   Sistemas de Tipos
   Sequenciadores
   Concorrência
   Conclusão

                   PLP - Linguagem Go
                                        2
Introdução
Introdução
   Motivação
   Sintaxe e Semântica
   Processador da Linguagem
   Outras Características




                         PLP - Linguagem Go
                                              4
Motivação
   Compilada
   Sensação de uma linguagem dinâmica
   Simula Orientação a Objetos
   Possui Garbage Collection
   Multi-processamento
   Open-source
   18a linguagem mais usada no mundo segundo o
    site da Tiobe




                    PLP - Linguagem Go
                                                  5
Sintaxe e Semântica
   Go reúne características sintáticas de várias
    linguagens

   Possui uma Sintaxe simples e intuitiva

   A sintaxe é descrita por uma Gramática
    (Extended Backus-Naur Form)

   Semântica Operacional



                       PLP - Linguagem Go
                                                    6
Processador da Linguagem
   Compilador: gccgo


   (6g, 6l, 8g, 8l)




     Código Fonte            *.8 ou *.6     Executável




                       PLP - Linguagem Go
                                                         7
Outras Características
   Criada pela Google e lançada em novembro de
    2009
   Equipe: Robert Griesemer, Rob Pike e Ken
    Thompson




                    PLP - Linguagem Go
                                                  8
Valores & Tipos
Valores & Tipos
   Valores                             Tipos
      Boolean                             Primitivos
      Numérico                            Compostos
      String                              Recursivo
      Array
      Struct                           Checagem de Tipos
                                        Equivalência de Tipos
      Ponteiros
                                        Princípio da Completude
      Abstração de função e            Expressões
       procedimento
      Mapa
      Channel




                          PLP - Linguagem Go
                                                                   10
Valores
 else if (jogador_atual.GetCor() == Vermelho){
      tomadas, tuplas, _ := JogadaObrigatoria(tabuleiro_jogo,
 jogador_atual.GetCor());
      if (LenArrayNode(tomadas) == 1){
          if (!tabuleiro_jogo.IsPecaDama(tuplas[0].X, tuplas[0].Y)) {
                 contagemEmpate = 0;
 }
          RealizarTomada(tabuleiro_jogo, tuplas[0].X, tuplas[0].Y,
 tomadas[0],
                           jogador_atual.GetCor(), true);
      }
         var posicao3 *Coordenada
 }



 Em Go, abstrações de funções e procedimentos são valores de segunda
  classe.
 Funções podem ser passadas como parâmetros e retornadas como valor
  de função.
                            PLP - Linguagem Go
                                                                        11
Valores             Númericos               Arrays     Abstração de Função
 else if (jogador_atual.GetCor() == Vermelho){
      tomadas, tuplas, _ := JogadaObrigatoria(tabuleiro_jogo,
 jogador_atual.GetCor());
      if (LenArrayNode(tomadas) == 1){
          if (!tabuleiro_jogo.IsPecaDama(tuplas[0].X, tuplas[0].Y)) {
                 contagemEmpate = 0;
 }
          RealizarTomada(tabuleiro_jogo, tuplas[0].X, tuplas[0].Y,
 tomadas[0], jogador_atual.GetCor(), true);
      }
         var posicao3 *Coordenada
 }


   Abstração de Procedimento                Ponteiro          Booleanos
 Em Go, abstrações de funções e procedimentos são valores de segunda
  classe.
 Funções podem ser passadas como parâmetros e retornadas como valor
  de função.
                                PLP - Linguagem Go
                                                                             12
Tipos Primitivos


                     var   barra string = "===== “
                     var   contagemEmpate int = 0
                     var   travou bool = false
                     var   porcentagem float = 10.5




 Boolean – Representa o conjunto de valores booleanos
 Numeric – Representa o conjunto de valores inteiros ou valores de ponto-
  flutuante
     uint(8, 16, 32, 64), int(8, 16, 32, 64), float(32, 64), complex(64, 128)
 String – Array de bytes. Imutável



                                PLP - Linguagem Go
                                                                                 13
Tipos Compostos
   Produtos Cartesianos : Structs

                   type Tabuleiro struct {
                           matriz [8] [8] *Peca
                           int totalPecas
                   }



 Struct – Sequência de elementos.
     Campos: possuem nome e tipo.
   Mapeamentos : Arrays, Mapas ou Funções
     resultado := map[string]int{"sao paulo" : 3, "corinthians" :0}


 Mapa – Grupo não ordenado de elementos. Possui Keys únicas.

                               PLP - Linguagem Go
                                                                      14
Tipos Compostos
   Produtos Cartesianos : Structs
                                                            [][]*Peca x int
                   type Tabuleiro struct {
                           matriz [8] [8] *Peca
                           int totalPecas
                   }



 Struct – Sequência de elementos.
     Campos: possuem nome e tipo.
   Mapeamentos : Arrays, Mapas ou Funções
     resultado := map[string]int{"sao paulo" : 3, "corinthians" :0}


 Mapa – Grupo não ordenado de elementos. Possui Keys únicas.

                               PLP - Linguagem Go
                                                                              15
Tipos Compostos
   Tipos Recursivos: Structs
                 type Node struct {
                     valor Tupla
                     next *Node
                 }



      Implementados através de ponteiros.

   Go não dá suporte:
     União Disjunta
     Conjuntos Potência



                           PLP - Linguagem Go
                                                16
Checagem de Tipos
    Go é estaticamente e fortemente tipada.
                 func main (){
                     var nome string = "plp"
                     nome = 18
                 }
                 prog.go:6: cannot convert 18 to type string
                 prog.go:6: cannot use 18 (type int) as
                            type string in assignment

                 func main (){
                                                         Erro ao tentar
    Fortemente        dez_decimal := 10.0
                      var dez int = dez_decimal           compilar!!!
                 }

                 prog.go:6: cannot use dez_decimal (type
                            float) as type int in assignment



                           PLP - Linguagem Go
                                                                          17
Equivalência de Tipos
   Go dá suporte a equivalência nominal
               package main

               type Peca struct {cor int, dama bool}
               type Tupla struct {tamanho int,comida bool}
               func (peca *Peca) EhDama () (bool){
                    return peca.dama
               }
               func main (){
                    var tupla *Tupla = new(Tupla)    Erro ao tentar
                    tupla.EhDama()                    compilar!!!
               }
               prog.go:15: tupla.EhDama undefined
                          (type Tupla has no field EhDama)



 Go não dá suporte a equivalência estrutural!

                              PLP - Linguagem Go
                                                                      18
Princípio da Completude
   Go quebra o princípio da completude de tipo.
     É necessário o uso do tipo File para manipular
      arquivos persistentes.
     Funções só podem retornar valores primitivos ou
      ponteiros.

         func (tabuleiro *Tabuleiro) IsZerou (cor int) bool
             if (…){
                 return false
             }
                 return true
         }




                         PLP - Linguagem Go
                                                              19
Expressões
   Literais: Valores dos tipos bool, int, uint, float, string
   Agregados: array, maps, structs
   Funções


   Go não dá suporte a:
     Expressões Condicionais
     Expressões Iterativas




                         PLP - Linguagem Go
                                                                 20
Armazenamento
Armazenamento
   Variáveis e Atualização             Tipos de Comandos
   Arrays                                 Skip
   Semântica de Cópia x                   Atribuição
    Semântica de Referência
                                           Chamada de
   Variáveis
                                            procedimento
      Locais e Globais
                                           Comandos
      Heap
                                              Sequencial
      Persistentes
                                              Colateral
                                              Condicional
                                           Expressões com Efeitos
                                            Colaterais



                          PLP - Linguagem Go
                                                                     22
Variáveis e Atualização
   Os valores armazenáveis (storables) são os
    valores dos tipos primitivos e ponteiros
   Variáveis Temporárias
     Todas as variáveis, com exceção do tipo File
   Variáveis Persistentes
     Em Go, as variáveis persistentes são do tipo File




                         PLP - Linguagem Go
                                                          23
Variáveis e Atualização
   Go dá suporte a atualização seletiva e atualização
    total

            var posicaoFinal Coordenada;      Seletiva
            posicaoFinal.x = 1;
            posicaoFinal.y = 2;
            var posicaoInicial Coordenada;    Total
            posicaoInicial = posicaoFinal;




                         PLP - Linguagem Go
                                                         24
Arrays
   Go dá suporte a Arrays Estáticos.
   Os arrays possuem tamanho fixo e não podem
    armazenar valores de tipos diferentes.

    func (tabuleiro *Tabuleiro) GetPecas (cor int) ([12]*Tupla){
        var pecas [12] *Tupla;
        (...)
        return pecas;
    }




                            PLP - Linguagem Go
                                                                   25
Semântica de Cópia x
    Semântica de Referência
   Semântica de cópia – utilizada para valores de
    qualquer tipo.
   Semântica de Referência – utilizada apenas para
    ponteiros.
            var posicao1 Coordenada;
            posicao1.x = 1;
            posicao1.y = 2;
            var posicao2 *Coordenada;
            var posicao3 *Coordenada;         Por Referência
            posicao2 = &posicao1;
            posicao3 = posicao2;
            posicao3.x = 5;
            posicao3.y = 5;                  Por Cópia




                        PLP - Linguagem Go
                                                               26
Variáveis Locais e Globais
   Variáveis Globais são declaradas da seguinte
    forma: var + nomeVariavel + tipo
   Para variáveis locais podem ser utilizados
    açúcares sintático
            var jogadorDaVez string = “tabuleiro”       Variável Global

            func main() {
                tamanho := 10;
 Açúcar         if (...){
                                                    Variáveis Locais
Sintático           var numBombas = 15;
                }
            }




                             PLP - Linguagem Go
                                                                          27
Variáveis Heap
   Variáveis podem ser declaradas a partir da
    palavra reservada new.
   Não existe um mecanismo para o programador
    destruir as variáveis. Go possui Garbage
    Collection.

                                               Alocação de
                                                memória


       var tabuleiro_jogo *Tabuleiro = new (Tabuleiro)




                          PLP - Linguagem Go
                                                             28
Variáveis persistentes

   São do tipo “File”

         oldfile := "text.txt"
         newfile := "text2.txt"
         doc, _ := ioutil.ReadFile(oldfile)
         ioutil.WriteFile(newfile,doc,0644)




                          PLP - Linguagem Go
                                               29
Skip e Atribuição


  for ; pilha != nil ; {
     tabTemp := tabuleiro.Copy()
     pilha, tuplaAtual = pilha.Pull()
     tabTemp.ComerPeca(posX, posY, tuplaAtual, cor)
     caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp,
          tuplaAtual.FicarX, tuplaAtual.FicarY, cor)
     tamanhoCaminhoTupla++




                 Não há atribuição múltipla em Go.


                        PLP - Linguagem Go
                                                                     30
Skip e Atribuição
 Skip usado para separar expressões                     Atribuição


    for ; pilha != nil ; {
       tabTemp := tabuleiro.Copy()
       pilha, tuplaAtual = pilha.Pull()
       tabTemp.ComerPeca(posX, posY, tuplaAtual, cor)
       caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp,
            tuplaAtual.FicarX, tuplaAtual.FicarY, cor)
       tamanhoCaminhoTupla++



     Açúcar sintático                               Atribuição simultânea



                        Não há atribuição múltipla em Go.


                               PLP - Linguagem Go
                                                                            31
Chamada de Procedimentos
                                   Chamada de procedimento

     peca := new (Peca)
     peca.SetCor(Preto)

     //...

     func (peca *Peca) SetCor (cor int) {
             peca.cor = cor
     }




         Procedimento




                   PLP - Linguagem Go
                                                             32
Comando Sequencial
    meuTabuleiro.n = 0; meuTabuleiro.m = 0; meuTabuleiro.ganhou = false;




     meuTabuleiro.n = 0                  Separados por ponto-e-vírgula,
     meuTabuleiro.m = 0                     ou por quebra de linha.
     meuTabuleiro.ganhou = false




Comando Colateral
    Não existem comandos colaterais.


                             PLP - Linguagem Go
                                                                           33
Comando Condicional
   Go dá suporte através de: if ,else e switch.
             var jogada int;
             if (ehHumano) {
                 var pos [2]int = JogarHumano();
                 jogada = tabuleiro.Jogada(pos);
             } else {
                 var pos [2]int = JogarAutomatico();
                 jogada = tabuleiro.Jogada(pos);
             }




             var aux string;
             switch opcao{
                 case 1: aux = "Jogar“
                 case 2: aux = "Ajuda"
                 case 3: aux = "Fechar"
             }

                         PLP - Linguagem Go
                                                       34
Comandos Iterativos
   Iteração definida
        for i:=0; caminhoAtual[i] != nil && i < MAXIMO_CAMINHOS;
        i++ {
            nodeAtual = new(Node);
            nodeAtual.SetValor(tuplaAtual);
            //...
        }



   Iteração indefinida
                                               Palavra reservada for
         for i > 0 {                            funcionando como o
             var a int = Random(n);             comando while em
             var b int = Random(n);
                                                 outras linguagens.
             //...
         }


                          PLP - Linguagem Go
                                                                       35
Associações
Associações
   Entidades Associáveis                 Comando Bloco
   Escopo                                Expressão Bloco
   Estrutura de Blocos                   Princípio da Qualificação
   Visibilidade

   Declarações
      Definição
      Declaração de Tipo
      Declaração de Variável
      Declarações Colaterais
      Declarações Sequenciais
      Declarações Recursivas



                            PLP - Linguagem Go
                                                                       37
Entidades Associáveis
   Valores primitivos e compostos
   Abstrações de funções e procedimentos
   Variáveis e Tipos

            meuTabuleiro.m = 0;
            meuTabuleiro.ganhou = false;
            var Numero int = calculaNumDeMinas(n);
            const( MAX_MOVIMENTOS int = 50);




                       PLP - Linguagem Go
                                                     38
Escopo
      const s = 2;

      func incremento ( d int ) int {
          return d∗s;
      }
      func executaIncremento ( valor int ) int {
          const s = 3;
          return incremento ( valor );
      }                                            Saída: 10
      func main () {
          fmt.Println( executaIncremento(5) );
      }



   Em Go, o corpo de um bloco é avaliado no
    ambiente em que foi definido (associação
    estática).
                          PLP - Linguagem Go
                                                               39
Blocos: Estrutura e Visibilidade
    var tamanhoTabuleiro int = 10;
    for {
        var tamanhoTabuleiro = 15;
        for {
            var tamanhoTabuleiro = 20;          imprime 20
            fmt.Println( tamanhoTabuleiro );
            break;
        }                                       imprime 15
        fmt.Println( tamanhoTabuleiro ) ;
        break;
    }                                           imprime 10
    fmt.Println( tamanhoTabuleiro );


   Estrutura: blocos aninhados.
   Visibilidade: variáveis declaradas em blocos
    de escopo internos não são visíveis a blocos
    de escopo externos.
                           PLP - Linguagem Go
                                                             40
Definição
   As definições em Go podem ser de tipo, abstração
    de funções, abstração de procedimentos, variáveis,
    constantes.

         const( MAX_MOVIMENTOS int = 50)
         func Jogada() (int,int) {
         //…
         }                                          Constante
         var posJogada;
         var posX *int;                         Abstração de função
         var posAux *int;
                                                Variáveis




                           PLP - Linguagem Go
                                                                      41
Declaração de Tipo

  type Peca struct {             Go dá suporte a declaração de tipos
      cor int;
      dama bool;                  através da palavra reservada type.
  }

                  O tipo Peca sendo declarado.



Declaração de Variável
         var vertical string = "Coordenada Vertical: “;
         var valor int = 1;
         var decimal float = 1.0;




                         PLP - Linguagem Go
                                                                        42
Declaração sequencial
    Como a maioria das linguagens imperativas,
     Go dá suporte à declaração sequencial.

           tamanhoMaiorCaminho := 0;
           tamanhoCaminhoTupla := 0;
           var pilha *Node = nil;
           var caminhoAtual [MAXIMO_CAMINHOS] *Node;




Declarações Colaterais
    Go não dá suporte a este tipo de declaração.


                        PLP - Linguagem Go
                                                       43
Declaração recursiva
     Go dá suporte a declaração recursiva.

func TomadaMaximaPeca(tabuleiro *Tabuleiro, posX int, posY int, cor int)
([MAXIMO_CAMINHOS] *Node, int) {
    caminhos := tabuleiro.GetOpcoesComida(posX, posY, cor);
    for ;pilha != nil; {
        caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp,
tuplaAtual.FicarX, tuplaAtual.FicarY, cor);
    return caminhosMaximos, tamanhoMaiorCaminho;
}




                                             Chamada recursiva




                            PLP - Linguagem Go
                                                                           44
Comando bloco
   Go dá suporte a comando bloco.



        func ( pilha ∗Node ) PrintValorProximo( ) {

               Println ( "|" , pilha.GetValor( ) , "|" );
               next := pilha.GetNext( );
               Println(next.GetValor());
         }



      Declaração que é usada apenas pra executar o comando




                          PLP - Linguagem Go
                                                             45
Expressão bloco

   Go dá suporte a expressão bloco.

           func (peca *Peca) GetValue(peca2 *Peca)(bool){
               valor1 := peca.EhDama()
               valor2 := peca2.EhDama()
               return valor1 && valor2
           }




          Declarações usadas apenas para avaliar a expressão.




                           PLP - Linguagem Go
                                                                46
Princípio da Qualificação
   Go não viola o princípio da qualificação, pois é
    possível realizar qualquer computação dentro de
    um bloco.
           func (pilha *Node) GetNext() (*Node, *Tupla){

               next := pilha.GetNext()
               valor := next.GetValor()
               func nome(){
                  //Corpo da funcao
               }
               return next, valor
           }


                                              Um bloco dentro do outro.

                         PLP - Linguagem Go
                                                                          47
Abstrações
Abstrações
   Tipos de Abstrações                    Argumentos
      Abstração de Função                 Passagem de Parâmetros
      Abstração de                        Princípio da
       Procedimento                         Correspondência
                                           Ordem de Avaliação
   Princípio da Abstração
   Parâmetros




                             PLP - Linguagem Go
                                                                     49
Abstração de Função
   Go dá suporte a abstrações de funções através da palavra
    reservada func.
   A presença do retorno caracteriza a abstração de função.



           func calculaNumDeMinas(tamanho int) int{
               numeroDeBombas := int(tamanho*tamanho*20/100);
               if (numeroDeBombas%2 == 0) {
                   numeroDeBombas += 1;
               }
               //m sempre impar
               if (tamanho <= 10) {
                   numeroDeBombas += 2;
               }
               return numeroDeBombas;
           }


                         PLP - Linguagem Go                     50
Abstração de Procedimento
   Go usa a mesma palavra reservada para caracterizar uma
    Abstração de Procedimento, como em Abstrações de Funções.
    (func)
   A diferença que caracteriza a Abstração de Procedimento é a
    falta do retorno.


                  func inicializarJogo() {
                      tabuleiro.ReiniciaTabuleiro();
                      ehHumano = true;
                  }




                          PLP - Linguagem Go
                                                                  51
Princípio da abstração

    Go não viola o princípio da abstração, pois é possível
     construir abstração sobre qualquer categoria sintática da
     linguagem, como por exemplo: variáveis, funções e
     procedimentos.




                          PLP - Linguagem Go
                                                                 52
Parâmetros
   Como Go é fortemente tipada, os parâmetros devem possuir
    tipos definidos.
   Podem ser de qualquer tipo.


                type Peca struct {
                    cor int
                    dama bool

                }
                func (peca *Peca) EhDama () (bool){
                    return peca.dama
                }




                          PLP - Linguagem Go
                                                               53
Passagem de Parâmetros
    Em Go a passagem de parâmetros é por cópiavalor.

                       func Inverter (i int) int {
                               if(i != 0) {
                                        return 0
                               }
                               return 1
                       }


 Go não dá suporte a passagem de parâmetros por referência,
    mas simula com o uso de ponteiros.
           func (pilha *Node) Pull() (*Node, *Tupla) {
                   return pilha.GetNext(), pilha.GetValor()
           }

                                      Ponteiro

                           PLP - Linguagem Go
                                                               54
Princípio da Correspondência

 Go viola o princípio da correspondência, pois não existe um
  mecanismo de passagem de parâmetro correspondente a
  definição de constante.
 Código abaixo não é compilável.

const constante = 10;

func funcao ( c const ) const {
         return c ;
}

func main ( ) {
         fmt.Println ("Imprimir constante:" , funcao ( constante ) ) ;
}

                  Dá erro de sintaxe

                          PLP - Linguagem Go
                                                                         55
Ordem de Avaliação
    Eager Evaluation


                    var p int;

                    func main () {
                        p = 3;
                        print ( p )
                    }
                                             Saída:
                    func print ( n int ) {
                        Println(n);
                                             3
                        p = 100;             3
                        Println(n);
                    }




                        PLP - Linguagem Go
                                                      56
Unidades de Programa
Unidades de Programa
   Pacotes
   Tipos Abstratos de Dados
   Objetos e Classes
   Unidades Genéricas




                          PLP - Linguagem Go
                                               58
Pacotes
   As funções e variáveis globais que começam com letra
    Maiúscula serão visíveis para quem importar esse pacote.
    Caso contrário, a função fica com visibilidade privada.
package tabuleiro
//...

func (meuTabuleiro *Tabuleiro) Ganhou() bool {
    return meuTabuleiro.ganhou;
}
                                                     Funções visíveis

func (meuTabuleiro *Tabuleiro) AlguemGanhou(){
    meuTabuleiro.ganhou = true;
}

func calculaNumDeMinas(tamanho int) int{
    //...                                             Função com
    return numeroDeBombas;                        visibilidade privada
}/

                           PLP - Linguagem Go
                                                                         59
Tipo Abstrato de Dados

      package tabuleiro

      import (. "fmt"; . "./pecaPkg"; . "./util")

      type Tabuleiro struct {matriz [8] [8] *Peca}

      func (tabuleiro *Tabuleiro) SetPecaDama (x int, y int){
          tabuleiro.matriz[x][y].SetDama(true)
      }
      //...




                          PLP - Linguagem Go
                                                                60
Objetos e Classes
    Go não tem Objetos e Classes, porém, simula-os através de
     structs e funções ligadas a esses tipos.
             type Node struct {
                 valor Tupla
                 next *Node
             }
             //...
             func (pilha *Node) Pull() (*Node, *Tupla) {
                 return pilha.GetNext(), pilha.GetValor()
             }



Unidades Genéricas
    Go não dá suporte a unidades genéricas.

                          PLP - Linguagem Go
                                                                 61
Sistemas de Tipos
Sistema de Tipos
   Monomorfismo
   Sobrecarga
   Polimorfismo Paramétrico
   Polimorfismo por Inclusão
   Interfaces
   Coerção




                           PLP - Linguagem Go
                                                63
Monomorfismo
func (meuTabuleiro *Tabuleiro) Ganhou() bool{
    return meuTabuleiro.ganhou;
}
func (meuTabuleiro *Tabuleiro) AlguemGanhou() {
    meuTabuleiro.ganhou = true;                 As abstrações definidas pelo
}                                                programador, em Go, são
                                                       monomórficas. Toda
                                                      entidade tem um tipo
                                                      específico associado.
Println("---------------------------");
Print("Linha: ");
Println(posMaquina[0]+1);
Print("Coluna: ");
Println(posMaquina[1]+1);                         Mas, algumas abstrações
Println("---------------------------");           embutidas (built-in) não
                                                    são monomórficas.




                             PLP - Linguagem Go
                                                                              64
Sobrecarga
   Go dá suporte a sobrecarga de operadores built-in.
   Entretanto, não dá suporte a sobrecarga de operaçoes.
   (Operadores: +, -, e outros)

var barra string = "===== “;
//...
if (tabuleiro_jogo.IsZerou (jogador1.GetCor())){
    Println(barra + "Jogador", jogador2.GetCor() + 1, "VENCEU! PARABÉNS", barra);
    break;
}//...




                  Para tipos da própria linguagem, um único
                   identificador ou operador pode denotar
                             diferentes abstrações.



                                 PLP - Linguagem Go
                                                                                    65
Polimorfismo por Inclusão
   type Natural int;
   type Inteiro int;
   var x Natural = 1;
   var y Inteiro = -1;
   Println(x+y);

   //input.go:10: invalid operation: x + y (type Natural + Inteiro)




                                Go não tem tipos que contenham
                                subtipos que herdam operações
                                aplicáveis a valores desses tipos.




                            PLP - Linguagem Go
                                                                      66
Polimorfismo Paramétrico
func polimorfismoParametrico(a int64, b int64) {
    Println(a);
    Println(b);
}
func main() {
    var x int8 = 1;
    var y int8 = 2;
    polimorfismoParametrico(x, y);
}

//input.go:13: cannot use x (type int8) as type int64 in function argument
//input.go:13: cannot use y (type int8) as type int64 in function argument




                  Go não dá suporte a polimorfismo paramétrico.




                                  PLP - Linguagem Go
                                                                             67
Interface
package main
import . "fmt";

func main(){
    jogador := new(Jogador);
    jogador.nome = "iza";                           Go simula
    peca := new(Peca);
    peca.cor = "preto";                              o uso de
    imprimir(jogador);
    imprimir(peca);                                  interface
}
                                                     com o tipo
type printer interface { Print(); }
                                                     “interface”.
func (p *Peca) Print() { Println(p.cor); }
func (j *Jogador) Print() { Println(j.nome); }

func imprimir (p printer) { p.Print(); }

type Peca struct { cor string; }
type Jogador struct { nome string; }

                         PLP - Linguagem Go
                                                                    68
Coersão
func Random(n int) int {
    sec, nsec, err := Time();
    if err != nil {
        Seed(int64(n));
    } else {
        Seed(int64(n)+(sec*1e9+nsec));
    }
    return int(Int63n(int64(n)))
}

                                       Não há mapeamento implícito de
                                     valores de um tipo para valores de um
                                                  outro tipo.

                                           Em substituição às coerções,
                                               são adotados casts.



                          PLP - Linguagem Go
                                                                          69
Sequenciadores
Sequenciadores
   Desvios Incondicionais
   Escapes
   Exceções




                             PLP - Linguagem Go
                                                  71
Desvios Incondicionais
                    I: Println(“Digite a dimensao: (N)");

                    var tam int = ReadInt();
                    if ( tam < 20 && tam > 4) {
                        goto L;
                    }

                    Println(“N fora do limite [4,20].");
                    goto I;

                    L: geraTabuleiro(tam);


   Para fazer Desvios Incondicionais usamos a palavra reservada “goto”
      Só podemos fazer desvios incondicionais dentro do escopo da
        abstração de função. (Não podemos ir para pontos mais externos do
        programa).

                             PLP - Linguagem Go
                                                                            72
Escape
for i := 0; i < len(tabuleiro); i++ {
    for j := 0; j < len(tabuleiro[i]); j++ {             Iteração afetada
            if (tabuleiro[i][j] == 9) {
                                                         pelo escape
                Println("Achou bomba na linha ", i+1);
                break;
            }
        }
}



       Go dá suporte a escape através da palavra
      reservada“break” e “continue”.
       Escape não rotulado apenas finaliza a iteração
      corrente.



                                PLP - Linguagem Go
                                                                            73
Escape rotulado
          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;
                  }
              }
          }


                                              Rótulo

  Go dá suporte a escape rotulado através da
   palavra reservada break mais o rótulo.



                         PLP - Linguagem Go
                                                               74
Exceções


      Go não dá suporte a exceções.




                  PLP - Linguagem Go
                                       75
Concorrência
Concorrência
var canal = make(chan int);
func main() {
    go rotina1();
    go rotina2();                   Channel
}
func rotina1(){                    Goroutines
    var i int = 0;
    for i = 0; i <= 100; i++ {         Go dá suporte a concorrência
         canal <- i;                    através de goroutines.
    }
}
                                       A comunicação entre os
func rotina2(){                         processos concorrentes é
  for {                                 através de channel.
      msg := <- canal;
      Println(msg);
      if(msg == 100){
        break;
      }
  }
}

                          PLP - Linguagem Go
                                                                       77
Spin-Lock
func acquire(){
        for(usandoRecurso){
        }
        usandoRecurso = true;
                                       Flag
}
func relinquish(){
        usandoRecurso = false;
}                                   O flag é uma variável global.
                                    Assim permitimos que apenas uma
func rotina1(){
    acquire();
                                     rotina tenha acesso ao recurso.
    //regiao critica
    relinquish();                     Rotinas
}

func rotina2(){
    acquire();
    //regiao critica
    relinquish();
}
                           PLP - Linguagem Go
                                                                       78
Conclusão
PLP - Linguagem Go
                     80
PLP - Linguagem Go
                     81
Referências
Referências
   http://alovasconcelos.net/
   http://golang.org
   http://tutorial.danielmazza.info/go
   RAMALHO, Franklin. Notas de Aula da disciplina Paradigmas de
    Linguagens de Programação, 2010.
   http://forum.zwame.pt/showthread.php?t=348920




                         PLP - Linguagem Go
                                                                   83

Mais conteúdo relacionado

Mais procurados

Aula 0. introdução ao scratch 1.4
Aula 0. introdução ao scratch 1.4Aula 0. introdução ao scratch 1.4
Aula 0. introdução ao scratch 1.4Scratch_TCC
 
Exercicios de estruturas condicionais - Lógica de Programação
Exercicios de estruturas condicionais - Lógica de ProgramaçãoExercicios de estruturas condicionais - Lógica de Programação
Exercicios de estruturas condicionais - Lógica de ProgramaçãoBruno Quaresma
 
Curso básico de Algoritmos com Python
Curso básico de Algoritmos com PythonCurso básico de Algoritmos com Python
Curso básico de Algoritmos com PythonGiancarlo Silva
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizesTácito Graça
 
Linguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesLinguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesElaine Cecília Gatto
 
02 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.502 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.5César Augusto Pessôa
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaDaniel Brandão
 
Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2Eder Samaniego
 
Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01Ramon Kayo
 
O Scratch no ensino da programação
O Scratch no ensino da programaçãoO Scratch no ensino da programação
O Scratch no ensino da programaçãoJoão Sá
 
Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosLeonardo Melo Santos
 

Mais procurados (20)

POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Aula 0. introdução ao scratch 1.4
Aula 0. introdução ao scratch 1.4Aula 0. introdução ao scratch 1.4
Aula 0. introdução ao scratch 1.4
 
Linguagem C 09 Ponteiros
Linguagem C 09 PonteirosLinguagem C 09 Ponteiros
Linguagem C 09 Ponteiros
 
Exercicios de estruturas condicionais - Lógica de Programação
Exercicios de estruturas condicionais - Lógica de ProgramaçãoExercicios de estruturas condicionais - Lógica de Programação
Exercicios de estruturas condicionais - Lógica de Programação
 
Curso básico de Algoritmos com Python
Curso básico de Algoritmos com PythonCurso básico de Algoritmos com Python
Curso básico de Algoritmos com Python
 
Linguagem C - Strings
Linguagem C - StringsLinguagem C - Strings
Linguagem C - Strings
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizes
 
Linguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesLinguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e Funções
 
Introdução a python
Introdução a pythonIntrodução a python
Introdução a python
 
Pilha e filas
Pilha e filasPilha e filas
Pilha e filas
 
Programando com Python
Programando com PythonProgramando com Python
Programando com Python
 
02 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.502 - Orientação a objetos e revisão de C# v1.5
02 - Orientação a objetos e revisão de C# v1.5
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - Herança
 
Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2Algoritmos 1 - Semana 2
Algoritmos 1 - Semana 2
 
Aula03 - JavaScript
Aula03 - JavaScriptAula03 - JavaScript
Aula03 - JavaScript
 
Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01Lógica de Programação com Javascript - Aula #01
Lógica de Programação com Javascript - Aula #01
 
O Scratch no ensino da programação
O Scratch no ensino da programaçãoO Scratch no ensino da programação
O Scratch no ensino da programação
 
Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetos
 

Destaque

"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?
"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?
"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?José Yoshiriro
 
Tratamento de exceções em GO
Tratamento de exceções em GOTratamento de exceções em GO
Tratamento de exceções em GOKarla Tahan
 
Seminário sobre GO
Seminário sobre GOSeminário sobre GO
Seminário sobre GOgptavares
 
Paradigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostosParadigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostosAdriano Teixeira de Souza
 
Construindo um Servidor Web com GO
Construindo um Servidor Web com GOConstruindo um Servidor Web com GO
Construindo um Servidor Web com GOBeto Muniz
 
Arquitetura de Computadores - Concorrência
Arquitetura de Computadores - ConcorrênciaArquitetura de Computadores - Concorrência
Arquitetura de Computadores - ConcorrênciaEvandro Júnior
 

Destaque (11)

Conhecendo Go
Conhecendo GoConhecendo Go
Conhecendo Go
 
"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?
"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?
"Go" Contra ou a favor? Já vale a pena investir nessa linguagem?
 
Linguagem Go
Linguagem GoLinguagem Go
Linguagem Go
 
Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
Tratamento de exceções em GO
Tratamento de exceções em GOTratamento de exceções em GO
Tratamento de exceções em GO
 
Seminário sobre GO
Seminário sobre GOSeminário sobre GO
Seminário sobre GO
 
Go Lang
Go LangGo Lang
Go Lang
 
Paradigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostosParadigmas de Linguagens de Programação - Tipos primitivos e compostos
Paradigmas de Linguagens de Programação - Tipos primitivos e compostos
 
Construindo um Servidor Web com GO
Construindo um Servidor Web com GOConstruindo um Servidor Web com GO
Construindo um Servidor Web com GO
 
Docker + Django
Docker + DjangoDocker + Django
Docker + Django
 
Arquitetura de Computadores - Concorrência
Arquitetura de Computadores - ConcorrênciaArquitetura de Computadores - Concorrência
Arquitetura de Computadores - Concorrência
 

Semelhante a Linguagem Go

Python - Programação funcional
Python - Programação funcionalPython - Programação funcional
Python - Programação funcionalfabiocerqueira
 
Introdução a Python - Python Poli
Introdução a Python  - Python PoliIntrodução a Python  - Python Poli
Introdução a Python - Python PoliRodrigo Lira
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Marco Mendes
 
Python Funcional
Python FuncionalPython Funcional
Python Funcionalpugpe
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellSérgio Souza Costa
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Tchelinux
 
Python introdução a linguagem de programação
Python introdução a linguagem de programaçãoPython introdução a linguagem de programação
Python introdução a linguagem de programaçãoAlysonTrindadeFernan
 

Semelhante a Linguagem Go (20)

Python - Programação funcional
Python - Programação funcionalPython - Programação funcional
Python - Programação funcional
 
Introdução a Python - Python Poli
Introdução a Python  - Python PoliIntrodução a Python  - Python Poli
Introdução a Python - Python Poli
 
Python
PythonPython
Python
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
 
Linguagem lua
Linguagem luaLinguagem lua
Linguagem lua
 
Mini-Curso: gnuplot
Mini-Curso: gnuplotMini-Curso: gnuplot
Mini-Curso: gnuplot
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
Pythonfuncional
PythonfuncionalPythonfuncional
Pythonfuncional
 
Python Funcional
Python FuncionalPython Funcional
Python Funcional
 
Linguagens de programação - Go
Linguagens de programação - GoLinguagens de programação - Go
Linguagens de programação - Go
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Standard ML / CPN ML
Standard ML / CPN MLStandard ML / CPN ML
Standard ML / CPN ML
 
Paradigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo HaskellParadigma Funcional - Caso de Estudo Haskell
Paradigma Funcional - Caso de Estudo Haskell
 
Tipos e valores
Tipos e valoresTipos e valores
Tipos e valores
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Introducao ao python
Introducao ao pythonIntroducao ao python
Introducao ao python
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
Python for zombies (very basic level)
Python for zombies (very basic level)Python for zombies (very basic level)
Python for zombies (very basic level)
 
Python introdução a linguagem de programação
Python introdução a linguagem de programaçãoPython introdução a linguagem de programação
Python introdução a linguagem de programação
 

Mais de Natã Melo

Sistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - KafkaSistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - KafkaNatã Melo
 
[Android] Publish on Google Play & Google Analytics
[Android] Publish on Google Play & Google Analytics[Android] Publish on Google Play & Google Analytics
[Android] Publish on Google Play & Google AnalyticsNatã Melo
 
[Android] Google Service Play & Google Maps
[Android] Google Service Play & Google Maps[Android] Google Service Play & Google Maps
[Android] Google Service Play & Google MapsNatã Melo
 
Minicurso grails
Minicurso grailsMinicurso grails
Minicurso grailsNatã Melo
 
Java Style Grading
Java Style Grading Java Style Grading
Java Style Grading Natã Melo
 
Listas em Prolog
Listas em PrologListas em Prolog
Listas em PrologNatã Melo
 
Motores de busca em redes sociais
Motores de busca em redes sociaisMotores de busca em redes sociais
Motores de busca em redes sociaisNatã Melo
 
MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...
MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...
MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...Natã Melo
 
Biografia de Bill Gates - Parte 4
Biografia de Bill Gates - Parte 4Biografia de Bill Gates - Parte 4
Biografia de Bill Gates - Parte 4Natã Melo
 
Biografia de Bill Gates - Parte 3
Biografia de Bill Gates - Parte 3Biografia de Bill Gates - Parte 3
Biografia de Bill Gates - Parte 3Natã Melo
 
Biografia de Bill Gates - Parte 2
Biografia de Bill Gates - Parte 2Biografia de Bill Gates - Parte 2
Biografia de Bill Gates - Parte 2Natã Melo
 
Biografia de Bill Gates - Parte 1
Biografia de Bill Gates - Parte 1Biografia de Bill Gates - Parte 1
Biografia de Bill Gates - Parte 1Natã Melo
 
Copas do Mundo de Futebol
Copas do Mundo de FutebolCopas do Mundo de Futebol
Copas do Mundo de FutebolNatã Melo
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem PythonNatã Melo
 
Sistemas Recomendação em Redes Sociais
Sistemas Recomendação em Redes SociaisSistemas Recomendação em Redes Sociais
Sistemas Recomendação em Redes SociaisNatã Melo
 
Sistema de Recomendação - Amigos DINS
Sistema de Recomendação - Amigos DINSSistema de Recomendação - Amigos DINS
Sistema de Recomendação - Amigos DINSNatã Melo
 
Regresão Múltipla
Regresão MúltiplaRegresão Múltipla
Regresão MúltiplaNatã Melo
 
Educação a Distância
Educação a DistânciaEducação a Distância
Educação a DistânciaNatã Melo
 
Teste Dirigido por Modelos
Teste Dirigido por ModelosTeste Dirigido por Modelos
Teste Dirigido por ModelosNatã Melo
 

Mais de Natã Melo (20)

Sistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - KafkaSistemas Distribuídos - Publish-Subscribe - Kafka
Sistemas Distribuídos - Publish-Subscribe - Kafka
 
[Android] Publish on Google Play & Google Analytics
[Android] Publish on Google Play & Google Analytics[Android] Publish on Google Play & Google Analytics
[Android] Publish on Google Play & Google Analytics
 
[Android] Google Service Play & Google Maps
[Android] Google Service Play & Google Maps[Android] Google Service Play & Google Maps
[Android] Google Service Play & Google Maps
 
Minicurso grails
Minicurso grailsMinicurso grails
Minicurso grails
 
Java Style Grading
Java Style Grading Java Style Grading
Java Style Grading
 
Listas em Prolog
Listas em PrologListas em Prolog
Listas em Prolog
 
Motores de busca em redes sociais
Motores de busca em redes sociaisMotores de busca em redes sociais
Motores de busca em redes sociais
 
MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...
MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...
MATRACA: Ferramenta open source para auxílio a deficientes visuais no uso do ...
 
Biografia de Bill Gates - Parte 4
Biografia de Bill Gates - Parte 4Biografia de Bill Gates - Parte 4
Biografia de Bill Gates - Parte 4
 
Biografia de Bill Gates - Parte 3
Biografia de Bill Gates - Parte 3Biografia de Bill Gates - Parte 3
Biografia de Bill Gates - Parte 3
 
Biografia de Bill Gates - Parte 2
Biografia de Bill Gates - Parte 2Biografia de Bill Gates - Parte 2
Biografia de Bill Gates - Parte 2
 
Biografia de Bill Gates - Parte 1
Biografia de Bill Gates - Parte 1Biografia de Bill Gates - Parte 1
Biografia de Bill Gates - Parte 1
 
Copas do Mundo de Futebol
Copas do Mundo de FutebolCopas do Mundo de Futebol
Copas do Mundo de Futebol
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
 
Sistemas Recomendação em Redes Sociais
Sistemas Recomendação em Redes SociaisSistemas Recomendação em Redes Sociais
Sistemas Recomendação em Redes Sociais
 
Sistema de Recomendação - Amigos DINS
Sistema de Recomendação - Amigos DINSSistema de Recomendação - Amigos DINS
Sistema de Recomendação - Amigos DINS
 
Terremotos
TerremotosTerremotos
Terremotos
 
Regresão Múltipla
Regresão MúltiplaRegresão Múltipla
Regresão Múltipla
 
Educação a Distância
Educação a DistânciaEducação a Distância
Educação a Distância
 
Teste Dirigido por Modelos
Teste Dirigido por ModelosTeste Dirigido por Modelos
Teste Dirigido por Modelos
 

Linguagem Go

  • 1. Paradigmas de Linguagens de Programação Delano Oliveira Janderson Jason Luan Barbosa Natã Melo {delanoho, jandersonjba, luanbg, natavm}@lcc.ufcg.edu.br
  • 2. Agenda  Introdução  Valores e Tipos  Armazenamento  Associações  Abstrações  Unidades de Programa  Sistemas de Tipos  Sequenciadores  Concorrência  Conclusão PLP - Linguagem Go 2
  • 4. Introdução  Motivação  Sintaxe e Semântica  Processador da Linguagem  Outras Características PLP - Linguagem Go 4
  • 5. Motivação  Compilada  Sensação de uma linguagem dinâmica  Simula Orientação a Objetos  Possui Garbage Collection  Multi-processamento  Open-source  18a linguagem mais usada no mundo segundo o site da Tiobe PLP - Linguagem Go 5
  • 6. Sintaxe e Semântica  Go reúne características sintáticas de várias linguagens  Possui uma Sintaxe simples e intuitiva  A sintaxe é descrita por uma Gramática (Extended Backus-Naur Form)  Semântica Operacional PLP - Linguagem Go 6
  • 7. Processador da Linguagem  Compilador: gccgo  (6g, 6l, 8g, 8l) Código Fonte *.8 ou *.6 Executável PLP - Linguagem Go 7
  • 8. Outras Características  Criada pela Google e lançada em novembro de 2009  Equipe: Robert Griesemer, Rob Pike e Ken Thompson PLP - Linguagem Go 8
  • 10. Valores & Tipos  Valores  Tipos  Boolean  Primitivos  Numérico  Compostos  String  Recursivo  Array  Struct  Checagem de Tipos  Equivalência de Tipos  Ponteiros  Princípio da Completude  Abstração de função e  Expressões procedimento  Mapa  Channel PLP - Linguagem Go 10
  • 11. Valores else if (jogador_atual.GetCor() == Vermelho){ tomadas, tuplas, _ := JogadaObrigatoria(tabuleiro_jogo, jogador_atual.GetCor()); if (LenArrayNode(tomadas) == 1){ if (!tabuleiro_jogo.IsPecaDama(tuplas[0].X, tuplas[0].Y)) { contagemEmpate = 0; } RealizarTomada(tabuleiro_jogo, tuplas[0].X, tuplas[0].Y, tomadas[0], jogador_atual.GetCor(), true); } var posicao3 *Coordenada }  Em Go, abstrações de funções e procedimentos são valores de segunda classe.  Funções podem ser passadas como parâmetros e retornadas como valor de função. PLP - Linguagem Go 11
  • 12. Valores Númericos Arrays Abstração de Função else if (jogador_atual.GetCor() == Vermelho){ tomadas, tuplas, _ := JogadaObrigatoria(tabuleiro_jogo, jogador_atual.GetCor()); if (LenArrayNode(tomadas) == 1){ if (!tabuleiro_jogo.IsPecaDama(tuplas[0].X, tuplas[0].Y)) { contagemEmpate = 0; } RealizarTomada(tabuleiro_jogo, tuplas[0].X, tuplas[0].Y, tomadas[0], jogador_atual.GetCor(), true); } var posicao3 *Coordenada } Abstração de Procedimento Ponteiro Booleanos  Em Go, abstrações de funções e procedimentos são valores de segunda classe.  Funções podem ser passadas como parâmetros e retornadas como valor de função. PLP - Linguagem Go 12
  • 13. Tipos Primitivos var barra string = "===== “ var contagemEmpate int = 0 var travou bool = false var porcentagem float = 10.5  Boolean – Representa o conjunto de valores booleanos  Numeric – Representa o conjunto de valores inteiros ou valores de ponto- flutuante  uint(8, 16, 32, 64), int(8, 16, 32, 64), float(32, 64), complex(64, 128)  String – Array de bytes. Imutável PLP - Linguagem Go 13
  • 14. Tipos Compostos  Produtos Cartesianos : Structs type Tabuleiro struct { matriz [8] [8] *Peca int totalPecas }  Struct – Sequência de elementos.  Campos: possuem nome e tipo.  Mapeamentos : Arrays, Mapas ou Funções resultado := map[string]int{"sao paulo" : 3, "corinthians" :0}  Mapa – Grupo não ordenado de elementos. Possui Keys únicas. PLP - Linguagem Go 14
  • 15. Tipos Compostos  Produtos Cartesianos : Structs [][]*Peca x int type Tabuleiro struct { matriz [8] [8] *Peca int totalPecas }  Struct – Sequência de elementos.  Campos: possuem nome e tipo.  Mapeamentos : Arrays, Mapas ou Funções resultado := map[string]int{"sao paulo" : 3, "corinthians" :0}  Mapa – Grupo não ordenado de elementos. Possui Keys únicas. PLP - Linguagem Go 15
  • 16. Tipos Compostos  Tipos Recursivos: Structs type Node struct { valor Tupla next *Node }  Implementados através de ponteiros.  Go não dá suporte:  União Disjunta  Conjuntos Potência PLP - Linguagem Go 16
  • 17. Checagem de Tipos  Go é estaticamente e fortemente tipada. func main (){ var nome string = "plp" nome = 18 } prog.go:6: cannot convert 18 to type string prog.go:6: cannot use 18 (type int) as type string in assignment func main (){ Erro ao tentar Fortemente dez_decimal := 10.0 var dez int = dez_decimal compilar!!! } prog.go:6: cannot use dez_decimal (type float) as type int in assignment PLP - Linguagem Go 17
  • 18. Equivalência de Tipos  Go dá suporte a equivalência nominal package main type Peca struct {cor int, dama bool} type Tupla struct {tamanho int,comida bool} func (peca *Peca) EhDama () (bool){ return peca.dama } func main (){ var tupla *Tupla = new(Tupla) Erro ao tentar tupla.EhDama() compilar!!! } prog.go:15: tupla.EhDama undefined (type Tupla has no field EhDama)  Go não dá suporte a equivalência estrutural! PLP - Linguagem Go 18
  • 19. Princípio da Completude  Go quebra o princípio da completude de tipo.  É necessário o uso do tipo File para manipular arquivos persistentes.  Funções só podem retornar valores primitivos ou ponteiros. func (tabuleiro *Tabuleiro) IsZerou (cor int) bool if (…){ return false } return true } PLP - Linguagem Go 19
  • 20. Expressões  Literais: Valores dos tipos bool, int, uint, float, string  Agregados: array, maps, structs  Funções  Go não dá suporte a:  Expressões Condicionais  Expressões Iterativas PLP - Linguagem Go 20
  • 22. Armazenamento  Variáveis e Atualização  Tipos de Comandos  Arrays  Skip  Semântica de Cópia x  Atribuição Semântica de Referência  Chamada de  Variáveis procedimento  Locais e Globais  Comandos  Heap  Sequencial  Persistentes  Colateral  Condicional  Expressões com Efeitos Colaterais PLP - Linguagem Go 22
  • 23. Variáveis e Atualização  Os valores armazenáveis (storables) são os valores dos tipos primitivos e ponteiros  Variáveis Temporárias  Todas as variáveis, com exceção do tipo File  Variáveis Persistentes  Em Go, as variáveis persistentes são do tipo File PLP - Linguagem Go 23
  • 24. Variáveis e Atualização  Go dá suporte a atualização seletiva e atualização total var posicaoFinal Coordenada; Seletiva posicaoFinal.x = 1; posicaoFinal.y = 2; var posicaoInicial Coordenada; Total posicaoInicial = posicaoFinal; PLP - Linguagem Go 24
  • 25. Arrays  Go dá suporte a Arrays Estáticos.  Os arrays possuem tamanho fixo e não podem armazenar valores de tipos diferentes. func (tabuleiro *Tabuleiro) GetPecas (cor int) ([12]*Tupla){ var pecas [12] *Tupla; (...) return pecas; } PLP - Linguagem Go 25
  • 26. Semântica de Cópia x Semântica de Referência  Semântica de cópia – utilizada para valores de qualquer tipo.  Semântica de Referência – utilizada apenas para ponteiros. var posicao1 Coordenada; posicao1.x = 1; posicao1.y = 2; var posicao2 *Coordenada; var posicao3 *Coordenada; Por Referência posicao2 = &posicao1; posicao3 = posicao2; posicao3.x = 5; posicao3.y = 5; Por Cópia PLP - Linguagem Go 26
  • 27. Variáveis Locais e Globais  Variáveis Globais são declaradas da seguinte forma: var + nomeVariavel + tipo  Para variáveis locais podem ser utilizados açúcares sintático var jogadorDaVez string = “tabuleiro” Variável Global func main() { tamanho := 10; Açúcar if (...){ Variáveis Locais Sintático var numBombas = 15; } } PLP - Linguagem Go 27
  • 28. Variáveis Heap  Variáveis podem ser declaradas a partir da palavra reservada new.  Não existe um mecanismo para o programador destruir as variáveis. Go possui Garbage Collection. Alocação de memória var tabuleiro_jogo *Tabuleiro = new (Tabuleiro) PLP - Linguagem Go 28
  • 29. Variáveis persistentes  São do tipo “File” oldfile := "text.txt" newfile := "text2.txt" doc, _ := ioutil.ReadFile(oldfile) ioutil.WriteFile(newfile,doc,0644) PLP - Linguagem Go 29
  • 30. Skip e Atribuição for ; pilha != nil ; { tabTemp := tabuleiro.Copy() pilha, tuplaAtual = pilha.Pull() tabTemp.ComerPeca(posX, posY, tuplaAtual, cor) caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp, tuplaAtual.FicarX, tuplaAtual.FicarY, cor) tamanhoCaminhoTupla++ Não há atribuição múltipla em Go. PLP - Linguagem Go 30
  • 31. Skip e Atribuição Skip usado para separar expressões Atribuição for ; pilha != nil ; { tabTemp := tabuleiro.Copy() pilha, tuplaAtual = pilha.Pull() tabTemp.ComerPeca(posX, posY, tuplaAtual, cor) caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp, tuplaAtual.FicarX, tuplaAtual.FicarY, cor) tamanhoCaminhoTupla++ Açúcar sintático Atribuição simultânea Não há atribuição múltipla em Go. PLP - Linguagem Go 31
  • 32. Chamada de Procedimentos Chamada de procedimento peca := new (Peca) peca.SetCor(Preto) //... func (peca *Peca) SetCor (cor int) { peca.cor = cor } Procedimento PLP - Linguagem Go 32
  • 33. Comando Sequencial meuTabuleiro.n = 0; meuTabuleiro.m = 0; meuTabuleiro.ganhou = false; meuTabuleiro.n = 0 Separados por ponto-e-vírgula, meuTabuleiro.m = 0 ou por quebra de linha. meuTabuleiro.ganhou = false Comando Colateral  Não existem comandos colaterais. PLP - Linguagem Go 33
  • 34. Comando Condicional  Go dá suporte através de: if ,else e switch. var jogada int; if (ehHumano) { var pos [2]int = JogarHumano(); jogada = tabuleiro.Jogada(pos); } else { var pos [2]int = JogarAutomatico(); jogada = tabuleiro.Jogada(pos); } var aux string; switch opcao{ case 1: aux = "Jogar“ case 2: aux = "Ajuda" case 3: aux = "Fechar" } PLP - Linguagem Go 34
  • 35. Comandos Iterativos  Iteração definida for i:=0; caminhoAtual[i] != nil && i < MAXIMO_CAMINHOS; i++ { nodeAtual = new(Node); nodeAtual.SetValor(tuplaAtual); //... }  Iteração indefinida Palavra reservada for for i > 0 { funcionando como o var a int = Random(n); comando while em var b int = Random(n); outras linguagens. //... } PLP - Linguagem Go 35
  • 37. Associações  Entidades Associáveis  Comando Bloco  Escopo  Expressão Bloco  Estrutura de Blocos  Princípio da Qualificação  Visibilidade  Declarações  Definição  Declaração de Tipo  Declaração de Variável  Declarações Colaterais  Declarações Sequenciais  Declarações Recursivas PLP - Linguagem Go 37
  • 38. Entidades Associáveis  Valores primitivos e compostos  Abstrações de funções e procedimentos  Variáveis e Tipos meuTabuleiro.m = 0; meuTabuleiro.ganhou = false; var Numero int = calculaNumDeMinas(n); const( MAX_MOVIMENTOS int = 50); PLP - Linguagem Go 38
  • 39. Escopo const s = 2; func incremento ( d int ) int { return d∗s; } func executaIncremento ( valor int ) int { const s = 3; return incremento ( valor ); } Saída: 10 func main () { fmt.Println( executaIncremento(5) ); }  Em Go, o corpo de um bloco é avaliado no ambiente em que foi definido (associação estática). PLP - Linguagem Go 39
  • 40. Blocos: Estrutura e Visibilidade var tamanhoTabuleiro int = 10; for { var tamanhoTabuleiro = 15; for { var tamanhoTabuleiro = 20; imprime 20 fmt.Println( tamanhoTabuleiro ); break; } imprime 15 fmt.Println( tamanhoTabuleiro ) ; break; } imprime 10 fmt.Println( tamanhoTabuleiro );  Estrutura: blocos aninhados.  Visibilidade: variáveis declaradas em blocos de escopo internos não são visíveis a blocos de escopo externos. PLP - Linguagem Go 40
  • 41. Definição  As definições em Go podem ser de tipo, abstração de funções, abstração de procedimentos, variáveis, constantes. const( MAX_MOVIMENTOS int = 50) func Jogada() (int,int) { //… } Constante var posJogada; var posX *int; Abstração de função var posAux *int; Variáveis PLP - Linguagem Go 41
  • 42. Declaração de Tipo type Peca struct {  Go dá suporte a declaração de tipos cor int; dama bool; através da palavra reservada type. } O tipo Peca sendo declarado. Declaração de Variável var vertical string = "Coordenada Vertical: “; var valor int = 1; var decimal float = 1.0; PLP - Linguagem Go 42
  • 43. Declaração sequencial  Como a maioria das linguagens imperativas, Go dá suporte à declaração sequencial. tamanhoMaiorCaminho := 0; tamanhoCaminhoTupla := 0; var pilha *Node = nil; var caminhoAtual [MAXIMO_CAMINHOS] *Node; Declarações Colaterais  Go não dá suporte a este tipo de declaração. PLP - Linguagem Go 43
  • 44. Declaração recursiva  Go dá suporte a declaração recursiva. func TomadaMaximaPeca(tabuleiro *Tabuleiro, posX int, posY int, cor int) ([MAXIMO_CAMINHOS] *Node, int) { caminhos := tabuleiro.GetOpcoesComida(posX, posY, cor); for ;pilha != nil; { caminhoAtual, tamanhoCaminhoTupla = TomadaMaximaPeca(tabTemp, tuplaAtual.FicarX, tuplaAtual.FicarY, cor); return caminhosMaximos, tamanhoMaiorCaminho; } Chamada recursiva PLP - Linguagem Go 44
  • 45. Comando bloco  Go dá suporte a comando bloco. func ( pilha ∗Node ) PrintValorProximo( ) { Println ( "|" , pilha.GetValor( ) , "|" ); next := pilha.GetNext( ); Println(next.GetValor()); } Declaração que é usada apenas pra executar o comando PLP - Linguagem Go 45
  • 46. Expressão bloco  Go dá suporte a expressão bloco. func (peca *Peca) GetValue(peca2 *Peca)(bool){ valor1 := peca.EhDama() valor2 := peca2.EhDama() return valor1 && valor2 } Declarações usadas apenas para avaliar a expressão. PLP - Linguagem Go 46
  • 47. Princípio da Qualificação  Go não viola o princípio da qualificação, pois é possível realizar qualquer computação dentro de um bloco. func (pilha *Node) GetNext() (*Node, *Tupla){ next := pilha.GetNext() valor := next.GetValor() func nome(){ //Corpo da funcao } return next, valor } Um bloco dentro do outro. PLP - Linguagem Go 47
  • 49. Abstrações  Tipos de Abstrações  Argumentos  Abstração de Função  Passagem de Parâmetros  Abstração de  Princípio da Procedimento Correspondência  Ordem de Avaliação  Princípio da Abstração  Parâmetros PLP - Linguagem Go 49
  • 50. Abstração de Função  Go dá suporte a abstrações de funções através da palavra reservada func.  A presença do retorno caracteriza a abstração de função. func calculaNumDeMinas(tamanho int) int{ numeroDeBombas := int(tamanho*tamanho*20/100); if (numeroDeBombas%2 == 0) { numeroDeBombas += 1; } //m sempre impar if (tamanho <= 10) { numeroDeBombas += 2; } return numeroDeBombas; } PLP - Linguagem Go 50
  • 51. Abstração de Procedimento  Go usa a mesma palavra reservada para caracterizar uma Abstração de Procedimento, como em Abstrações de Funções. (func)  A diferença que caracteriza a Abstração de Procedimento é a falta do retorno. func inicializarJogo() { tabuleiro.ReiniciaTabuleiro(); ehHumano = true; } PLP - Linguagem Go 51
  • 52. Princípio da abstração  Go não viola o princípio da abstração, pois é possível construir abstração sobre qualquer categoria sintática da linguagem, como por exemplo: variáveis, funções e procedimentos. PLP - Linguagem Go 52
  • 53. Parâmetros  Como Go é fortemente tipada, os parâmetros devem possuir tipos definidos.  Podem ser de qualquer tipo. type Peca struct { cor int dama bool } func (peca *Peca) EhDama () (bool){ return peca.dama } PLP - Linguagem Go 53
  • 54. Passagem de Parâmetros  Em Go a passagem de parâmetros é por cópiavalor. func Inverter (i int) int { if(i != 0) { return 0 } return 1 }  Go não dá suporte a passagem de parâmetros por referência, mas simula com o uso de ponteiros. func (pilha *Node) Pull() (*Node, *Tupla) { return pilha.GetNext(), pilha.GetValor() } Ponteiro PLP - Linguagem Go 54
  • 55. Princípio da Correspondência  Go viola o princípio da correspondência, pois não existe um mecanismo de passagem de parâmetro correspondente a definição de constante.  Código abaixo não é compilável. const constante = 10; func funcao ( c const ) const { return c ; } func main ( ) { fmt.Println ("Imprimir constante:" , funcao ( constante ) ) ; } Dá erro de sintaxe PLP - Linguagem Go 55
  • 56. Ordem de Avaliação  Eager Evaluation var p int; func main () { p = 3; print ( p ) } Saída: func print ( n int ) { Println(n); 3 p = 100; 3 Println(n); } PLP - Linguagem Go 56
  • 58. Unidades de Programa  Pacotes  Tipos Abstratos de Dados  Objetos e Classes  Unidades Genéricas PLP - Linguagem Go 58
  • 59. Pacotes  As funções e variáveis globais que começam com letra Maiúscula serão visíveis para quem importar esse pacote. Caso contrário, a função fica com visibilidade privada. package tabuleiro //... func (meuTabuleiro *Tabuleiro) Ganhou() bool { return meuTabuleiro.ganhou; } Funções visíveis func (meuTabuleiro *Tabuleiro) AlguemGanhou(){ meuTabuleiro.ganhou = true; } func calculaNumDeMinas(tamanho int) int{ //... Função com return numeroDeBombas; visibilidade privada }/ PLP - Linguagem Go 59
  • 60. Tipo Abstrato de Dados package tabuleiro import (. "fmt"; . "./pecaPkg"; . "./util") type Tabuleiro struct {matriz [8] [8] *Peca} func (tabuleiro *Tabuleiro) SetPecaDama (x int, y int){ tabuleiro.matriz[x][y].SetDama(true) } //... PLP - Linguagem Go 60
  • 61. Objetos e Classes  Go não tem Objetos e Classes, porém, simula-os através de structs e funções ligadas a esses tipos. type Node struct { valor Tupla next *Node } //... func (pilha *Node) Pull() (*Node, *Tupla) { return pilha.GetNext(), pilha.GetValor() } Unidades Genéricas  Go não dá suporte a unidades genéricas. PLP - Linguagem Go 61
  • 63. Sistema de Tipos  Monomorfismo  Sobrecarga  Polimorfismo Paramétrico  Polimorfismo por Inclusão  Interfaces  Coerção PLP - Linguagem Go 63
  • 64. Monomorfismo func (meuTabuleiro *Tabuleiro) Ganhou() bool{ return meuTabuleiro.ganhou; } func (meuTabuleiro *Tabuleiro) AlguemGanhou() { meuTabuleiro.ganhou = true; As abstrações definidas pelo } programador, em Go, são monomórficas. Toda entidade tem um tipo específico associado. Println("---------------------------"); Print("Linha: "); Println(posMaquina[0]+1); Print("Coluna: "); Println(posMaquina[1]+1); Mas, algumas abstrações Println("---------------------------"); embutidas (built-in) não são monomórficas. PLP - Linguagem Go 64
  • 65. Sobrecarga Go dá suporte a sobrecarga de operadores built-in. Entretanto, não dá suporte a sobrecarga de operaçoes. (Operadores: +, -, e outros) var barra string = "===== “; //... if (tabuleiro_jogo.IsZerou (jogador1.GetCor())){ Println(barra + "Jogador", jogador2.GetCor() + 1, "VENCEU! PARABÉNS", barra); break; }//... Para tipos da própria linguagem, um único identificador ou operador pode denotar diferentes abstrações. PLP - Linguagem Go 65
  • 66. Polimorfismo por Inclusão type Natural int; type Inteiro int; var x Natural = 1; var y Inteiro = -1; Println(x+y); //input.go:10: invalid operation: x + y (type Natural + Inteiro) Go não tem tipos que contenham subtipos que herdam operações aplicáveis a valores desses tipos. PLP - Linguagem Go 66
  • 67. Polimorfismo Paramétrico func polimorfismoParametrico(a int64, b int64) { Println(a); Println(b); } func main() { var x int8 = 1; var y int8 = 2; polimorfismoParametrico(x, y); } //input.go:13: cannot use x (type int8) as type int64 in function argument //input.go:13: cannot use y (type int8) as type int64 in function argument Go não dá suporte a polimorfismo paramétrico. PLP - Linguagem Go 67
  • 68. Interface package main import . "fmt"; func main(){ jogador := new(Jogador); jogador.nome = "iza";  Go simula peca := new(Peca); peca.cor = "preto"; o uso de imprimir(jogador); imprimir(peca); interface } com o tipo type printer interface { Print(); } “interface”. func (p *Peca) Print() { Println(p.cor); } func (j *Jogador) Print() { Println(j.nome); } func imprimir (p printer) { p.Print(); } type Peca struct { cor string; } type Jogador struct { nome string; } PLP - Linguagem Go 68
  • 69. Coersão func Random(n int) int { sec, nsec, err := Time(); if err != nil { Seed(int64(n)); } else { Seed(int64(n)+(sec*1e9+nsec)); } return int(Int63n(int64(n))) } Não há mapeamento implícito de valores de um tipo para valores de um outro tipo. Em substituição às coerções, são adotados casts. PLP - Linguagem Go 69
  • 71. Sequenciadores  Desvios Incondicionais  Escapes  Exceções PLP - Linguagem Go 71
  • 72. Desvios Incondicionais I: Println(“Digite a dimensao: (N)"); var tam int = ReadInt(); if ( tam < 20 && tam > 4) { goto L; } Println(“N fora do limite [4,20]."); goto I; L: geraTabuleiro(tam);  Para fazer Desvios Incondicionais usamos a palavra reservada “goto”  Só podemos fazer desvios incondicionais dentro do escopo da abstração de função. (Não podemos ir para pontos mais externos do programa). PLP - Linguagem Go 72
  • 73. Escape for i := 0; i < len(tabuleiro); i++ { for j := 0; j < len(tabuleiro[i]); j++ { Iteração afetada if (tabuleiro[i][j] == 9) { pelo escape Println("Achou bomba na linha ", i+1); break; } } }  Go dá suporte a escape através da palavra reservada“break” e “continue”.  Escape não rotulado apenas finaliza a iteração corrente. PLP - Linguagem Go 73
  • 74. Escape rotulado 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; } } } Rótulo  Go dá suporte a escape rotulado através da palavra reservada break mais o rótulo. PLP - Linguagem Go 74
  • 75. Exceções  Go não dá suporte a exceções. PLP - Linguagem Go 75
  • 77. Concorrência var canal = make(chan int); func main() { go rotina1(); go rotina2(); Channel } func rotina1(){ Goroutines var i int = 0; for i = 0; i <= 100; i++ {  Go dá suporte a concorrência canal <- i; através de goroutines. } }  A comunicação entre os func rotina2(){ processos concorrentes é for { através de channel. msg := <- canal; Println(msg); if(msg == 100){ break; } } } PLP - Linguagem Go 77
  • 78. Spin-Lock func acquire(){ for(usandoRecurso){ } usandoRecurso = true; Flag } func relinquish(){ usandoRecurso = false; }  O flag é uma variável global.  Assim permitimos que apenas uma func rotina1(){ acquire(); rotina tenha acesso ao recurso. //regiao critica relinquish(); Rotinas } func rotina2(){ acquire(); //regiao critica relinquish(); } PLP - Linguagem Go 78
  • 83. Referências  http://alovasconcelos.net/  http://golang.org  http://tutorial.danielmazza.info/go  RAMALHO, Franklin. Notas de Aula da disciplina Paradigmas de Linguagens de Programação, 2010.  http://forum.zwame.pt/showthread.php?t=348920 PLP - Linguagem Go 83