Language Ricardo Saori Leandro Felipe http://golang.org Jennifer Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Introdução Neste seminário, mostraremos a Linguagem GO abordando seus principais aspectos e caracteristicas que julgamos importante para seu diferencial em relação as linguagens até então conhecidas. Para o melhor entedimento usaremos comparações com as linguagens C e Java. http://golang.org Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Como chegamos aqui Segundo Rob Pike: 1) C e Unix tornaram-se dominante nas pesquisas; 2) O desejo por uma linguagem de alto-nível levou a C++, apesar de ter sido um ajuste pobre, possibilitou uma programação de alto nível para Unix; 3) C++ se tornou a principal escolha na indústria e nas pesquisas universitarias; 4) Java surgiu como uma visão mais limpa de C++, 5) Pelo final dos anos 90, Java foi escolhida como linguagem para ensino. http://golang.org Programação se tornou díficil Essas linguagens são difíceis de usar Elas são sutis, complexas e detalhadas. Seu modelo padrão está “sobrevendido” e nós respondemos com add-on como “padrões” (Norvig: os padrões são uma demonstração de fraqueza em uma linguagem.) No entanto, essas linguagens são bem sucedidas e vitais. http://golang.org Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico Orientação a objetos Algoritmo Exemplo Conclusão - Conclusão - Refêrencia http://golang.org Reação A falta de jeito das principais linguagens causou uma reação: uma série de sucessos de linguagens mais simples (Python, Ruby, Lua, Java Script, Erlang…). Isso demonstra a insatisfação com o modelo padrão e a abordagem, cada vez mais popular, do novo modelo. http://golang.org As vantagens As linguagens padrões são muito fortes: type-safe, eficazes e eficientes Nas mãos de especialistas, elas são ótimas Grandes sistemas e grandes empresas são construídas em cima delas Na prática, elas funcionam bem para programação em grande escala: programas de grande porte e número alto de programadores. http://golang.org As desvantagens As linguagens padrões são difíceis de usar Compiladores são lentos e exigentes. Binários são enormes. Muitos programadores preferem evitá-las. As linguagens tem, pelo menos, 10 anos de idade e são mal adaptadas para os ambientes atuais ( multicores, nuvens de rede). http://golang.org Qual seria o ideal ? Manter as vantagens e evitar as desvantagens ( ÓBVIO!!!!) : - A sensação de uma linguagem dinâmica com a segurança de um sistema estático; - Compilação rápida; - Tempo de execução real que suporta GC; - Leve, sistema flexível; - Possui métodos, mas não é uma linguagem OO convencional. http://golang.org Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Hello World! Em C: #include <stdio.h> int main(){ printf("Hello World!"); return 0; } http://golang.org Hello World! Em Java: public class Main { public static void main(String[] args) { System.out.print("Hello World!"); } } http://golang.org Hello World! Em Ruby: puts “Hello World!” http://golang.org Hello World! Em Go: import "fmt" func main() { fmt.Print("Hello World!") } http://golang.org Γειά σου Κόσμε!" Em Go: import "fmt" func main() { fmt.Print("Γειά σου Κόσμε!") } http://golang.org こんにちは、世界! Em Go: import "fmt" func main() { fmt.Print("こんにちは、世界!") } http://golang.org Básico da Linguagem É baseada em C com participação da família Pascal / Modula / Oberon (declarações, pacotes), além de algumas idéias de linguagens inspiradas por Tony Hoare (simultaneidade) http://golang.org Váriaveis Declarações: muito parecidas com C, mas de forma invertida, várias formas de declaração para se adequar ao uso da váriavel em questão // Forma completa var variável_A1 int = 10 var variável_A2 string = "dez“ // Forma menos abreviada var variável_B1 = 20 var variável_B2 = "vinte“ // Forma mais abreviada (variáveis locais apenas) variável_C1 := 30 variável_C2 := "trinta“ variável_C3 := uint64(10) //Atribuição múltipla x, y, z := 10, 10.0, "dez" http://golang.org Váriaveis Tipos numéricos: uso de palavras intuitivas, sem conversões implicitas ( int != int32) http://golang.org Váriaveis Booleanos: o tipo bool pode assumir os valores true ou false, o operador if usa apenas expressões booleanas, ponteiros e inteiros não são booleanos. Go: var a bool = 2<3 var b bool = false http://golang.org Estruturas de controle If: if x > 0 { // código } For: Go a implementa for de forma mais genérica e flexível que o usual. // Como o for do C for inicial; condição; final { /* código */ } // Como o while do C for condição { /* código */ } // Loop, como o for(;;) do C for { /* código */ } // Percorrer uma lista for c, v := range lista { // c = chave (key), v = valor } http://golang.org Estruturas de controle Switch: É geralmente usado para testagens massivas sobre um mesmo objeto/valor, porém Go permite o uso mais amplo também nesse caso. Algo a ser testado pode tanto ser um valor simples quanto um objeto complexo e para cada case pode-se fazer mais de um teste. switch algo { default: /* código */ case "A", "B", "C": /* código */ case "1", "2", "3": /* código */ } http://golang.org Funções Podem retornar valores de diferentes tipos. func MySqrt(f float64) (float64, bool) { if f >= 0 { return math.Sqrt(f), true } return 0, false } http://golang.org Funções Um simples return retorna os valores default das váriaveis de retorno func MySqrt(f float64) (v float64, ok bool) { if f >= 0 { v,ok = math.Sqrt(f), true } return // return 0, false } http://golang.org Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Orientação a objetos Resumo: OO é um tipo especial de "empacotamento" de código no qual um contexto é logicamente isolado do restante e tratado em termos de input e output. import "fmt" type MinhaEstrutura struct { nome string número int } func (minha *MinhaEstrutura) ImprimaNomeENúmero() { fmt.Printf("Nome:\t%s\nNúmero:\t%d\n", minha.nome, minha.número) } func main() { m := new(MinhaEstrutura) m.nome = "Fulano" m.número = 10 m.ImprimaNomeENúmero()} http://golang.org Orientação a objetos • Classe: representa um conjunto de objetos com características afins. • (mais especialmente uma interface) http://golang.org Orientação a objetos • Go não é realmente orientado a objetos • Não tem herança • Logo não tem polimorfismo • Apenas utiliza alguns conceitos • Interface http://golang.org Orientação a objetos (Java) public class C1 /*extendsObject*/{ //lista de atributos //construtor //metodos //classes internas } http://golang.org Orientação a objetos • Em java um método geralmente altera os atributos da própria classe. • E se tivermos a necessidade de utilizar um tipo especial de dados mas a linguagem não oferecer suporte? http://golang.org Orientação a objetos Em C quando queremos definir um tipo diferente de dados utilizamos o typedef typedef struct A { ... } A; main(){... A *a = (A*)malloc(sizeof(A)); ...} http://golang.org Orientação a objetos (C) E para manipularmos este novo tipo? void add(A* a, int i){ ... //aqui dentro manipulamos “a”.. } http://golang.org Orientação a objetos (C) O que você mais odeia em C quando esta lidando com tipos novos de dados? http://golang.org Orientação a objetos (C) O que você mais odeia em C quando esta lidando com tipos novos de dados? Passar a variável a ser manipulada como parâmetro? http://golang.org Orientação a objetos Orientação a objetos resolveria isso! a.add(i); Simples assim! http://golang.org “Orientação a objetos” (Go) Em go não existe classe! Mas existe interface... type A interface { add(i int) ...} http://golang.org “Orientação a objetos” (Go) Mas em quem a função add(int) vai agir? http://golang.org “Orientação a objetos” (Go) Interfaces não contém o código propriamente dito, são apenas “assinaturas”. Go permite ao programador especificar em quem um método ira agir sem a passagem de parâmetro. http://golang.org “Orientação a objetos” (Go) func (a *A) add(i int){ a.valor = i } Deste modo a função add funciona apenas ao tipo de estrutura “A”, como se fosse uma orientação a objetos sem todos aqueles conceitos(chatos). http://golang.org Orientação a objetos // retorna um ponteiro para uma nova variável http://golang.org add(int) e aplicáveis *arv as funões max() são apenas ao tipo E onde entra a interface na história? Nossa estrutura criada obedece estas três interfaces pois existem os métodos add(int) e max() que são aplicáveis a ela. • Repare que a função não recebeu nossa estrutura criada, mas sim a interface... Esta função sabe trabalhar com quaisquer tipos de dados que satisfaçam a interface “arvore” Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Quick Sort (Java) public static void quick_sort(int []v,int ini, int fim){ int meio; if(ini<fim){ meio = partition(v,ini,fim); quick_sort(v,ini,meio); quick_sort(v,meio+1,fim); } } http://golang.org Quick Sort (Java) public static int partition(int []v, int ini, int fim){ int pivo, topo,i; pivo = v[ini]; topo = ini; for(i=ini+1;i<fim;i++){ if(v[i]<pivo){ v[topo]=v[i]; v[i]=v[topo+1]; topo++; } } v[topo]=pivo; return topo; } http://golang.org Quick Sort (Java + Go) func quick_sort(v []int,ini, fim int){ var meio int if ini<fim { meio = partition(v,ini,fim) quick_sort(v,ini,meio) quick_sort(v,meio+1,fim) } } http://golang.org Quick Sort (Java + Go) func partition(v []int,ini, fim int) int{ var pivo, topo, i int pivo = v[ini] topo = ini for i=ini+1; i<fim; i++ { if(v[i]<pivo){ v[topo]=v[i] v[i]=v[topo+1] topo++ } } v[topo]=pivo return topo } http://golang.org Quick Sort (Go) func quick_sort(v []int){ var meio int if 0<len(v)-1 { meio = partition(v) quick_sort(v[0:meio]) quick_sort(v[meio+1:len(v)]) } } http://golang.org Quick Sort (Go) func partition(v []int) int{ var pivo, topo, i int pivo = v[0] topo = 0 for i=1; i< len(v); i++ { if(v[i]<pivo){ v[topo]=v[i] v[i]=v[topo+1] topo++ } } v[topo]=pivo return topo } http://golang.org Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Conclusão - Linguagem muito imatura; - É baseada na arquitetura atual (Von Neumann) o que a torna mais próxima do paradgima imperativo; - Pouco mais produtiva que C; - Tenta dar uma falsa impressão de flexibilidade. http://golang.org Índice - Introdução - História - Observações iniciais - Moderno x Antigo - GO - Básico - Orientação a objetos - Algoritmo Exemplo - Conclusão - Refêrencia http://golang.org Referência - https:// sites.google.com/a/danielmazza.info/tut orial/go - http://golang.org/doc/effective_go.html - “100428-pike-stanford” - Go Course Day (1, 2 e 3) http://golang.org