Vai | ||
Data da primeira versão | 10 de novembro de 2009 | |
---|---|---|
Paradigma | Linguagem compilada , programação concorrente , imperativa e estruturada | |
Autor |
Robert Griesemer (in) Rob Pike Ken Thompson |
|
Última versão | 1.16.5 (3 de junho de 2021) | |
Versão de desenvolvimento | 1,16beta1 (17 de dezembro de 2020) | |
Digitando | Forte , estático , estrutural | |
Influenciado por |
C Python Oberon-2 ( pt ) Limbo Active Oberon ( pt ) Comunicação de processos sequenciais Pascal Oberon Smalltalk Newsqueak ( pt ) Modula-2 Alef APL BCPL Modula ( pt ) Occam |
|
Sistema operacional | Windows , GNU / Linux , Mac OS X , FreeBSD , OpenBSD , DragonflyBSD , Solaris , Plano 9 | |
Licença | Licença BSD , patenteada | |
Local na rede Internet | golang.org | |
Extensão de arquivo | vai | |
Go é uma linguagem de programação compilada e concorrente inspirada em C e Pascal . Esta linguagem foi desenvolvida pelo Google a partir de um conceito inicial de Robert Griesemer , Rob Pike e Ken Thompson . Go tem duas implementações: a primeira usa gc , o compilador Go; o segundo usa gccgo , “ frontend ” GCC escrito em C ++ . Go é escrito em C usando yacc e GNU Bison para análise até a versão 1.4, e no próprio Go para versões subsequentes (1.5).
Uma meta Go é dada por Rob Pike, um de seus três criadores, que diz sobre desenvolvedores inexperientes:
“Eles não entendem uma linguagem brilhante, mas queremos que façam bons programas. Assim, a linguagem que damos a eles deve ser fácil de entender e fácil de adotar ”
Go quer facilitar e acelerar a programação em grande escala: devido à sua simplicidade, é concebível usá-lo também para escrever aplicativos, scripts ou grandes sistemas. Essa simplicidade também é necessária para garantir a manutenção e a evolução dos programas ao longo de várias gerações de desenvolvedores.
Embora também vise a velocidade de execução, essencial para a programação do sistema, considera o multithreading como o meio mais robusto de garantir essa velocidade nos processadores atuais, facilitando a manutenção, separando tarefas simples executadas de forma independente para evitar a criação de "fábricas de gás". Esse design também permite a operação livre de gravação em arquiteturas de vários núcleos , explorando imediatamente o aumento de potência correspondente.
Aqui está um exemplo de um programa típico Hello world escrito em Go:
package main import "fmt" func main() { fmt.Printf("Hello, world\n") }A linguagem Go foi criada para programação de sistema e desde então foi estendida para aplicativos, que é o mesmo destino que C e especialmente C ++. É uma linguagem imperativa e competitiva . Sua velocidade de compilação (devido à simplicidade de sua sintaxe) às vezes faz com que seja usado como uma linguagem de script.
Go integra diretamente, como Java , processamento de código simultâneo. A palavra-chave gopermite que uma chamada de função seja executada em competição com o goroutine atual. Uma goroutina , assim chamada por analogia distante com co - rotinas , é um encadeamento de execução supervisionado pelo escalonador incluído no tempo de execução. O programa então aproveitará a topologia do computador para melhor executar as goroutines, não necessariamente em uma nova thread, mas também é possível que um grupo de goroutines seja multiplexado em um grupo de threads.
Para chamar uma função f , escrevemos f () . Para chamá-la de goroutine, simplesmente escrevemos go f () , que é muito semelhante à tarefa call f ; da PL / I , uma linguagem que também gerencia multitarefa desde 1970.
Goroutines se comunicam entre si passando mensagens , enviando ou recebendo mensagens através de canais.
Essas mensagens sincronizam as goroutines entre si de acordo com o modelo CSP , considerado pelos autores mais intuitivo que o modelo multi-threaded (com sincronização por semáforos compreendendo travas, noção também introduzida por Dijkstra ).
No estado atual da linguagem (2018)
A linguagem contém aspectos de Pascal e C, mas nos expomos a muitos erros se esquecermos momentaneamente que não estamos nem em Pascal nem em C. Portanto, a:=baloque uma variável a atribuindo a ela o valor e o tipo de b, mas se a variável já foi alocada, você só terá que escrever a=b. Não deve ser confundido com a==b(igualdade de valores). A expressão atrás de a ifnão precisa de parênteses, mas a expressão a ser executada se o teste for aprovado deve ser colocada entre colchetes. Em seu estado atual, o compilador não tolera que uma variável declarada não seja usada, o que certamente encoraja boas práticas, mas torna a tentativa e erro para depurar programas muito penosa.
Go conhece tipos escalares (inteiros intou int64flutuantes float, strings string), arrays indexados por inteiros começando em 0, mapas que são coleções de objetos indexados por chaves (chamados de dicionários , hashes ou arrays associativos em outros idiomas) e fatias que são uma generalização dinâmica de matrizes.
Ele acessa facilmente arquivos de leitura e gravação, seja em modo de linha ou caractere, ou absorvendo todo o arquivo, por meio dos pacotes os e io .
Go possui um sistema do tipo estático , fortemente tipado , estrutural e seguro , baseado na inferência de tipo com possibilidade de utilização de uma tipagem explícita.
Para dar um exemplo, a escrita s := "Camélia", que declara, aloca e inicializa s, é possível e não força a escrita var s string = "Camélia", que no entanto permanece aceita.
A compatibilidade do tipo composto é baseada nas propriedades e não no nome. Ou seja, dois tipos compostos serão equivalentes se suas propriedades forem equivalentes: mesmo nome para a propriedade e equivalência de tipo. Esta é a tipagem estrutural .
Isso tem como consequência que a linguagem não é objeto no sentido clássico (seja com classes ou com protótipo ), porém os designers da linguagem fizeram uma escolha mais original por uma linguagem estática. É possível definir interfaces que transportam métodos que descrevem o comportamento de um objeto (também é possível misturar várias interfaces em uma). As funções Go podem declarar que aceitam um argumento desta interface. Um objeto que declara todos os métodos desta interface, com a mesma assinatura, pode ser passado como argumento deste método. A verificação de tipo é feita estaticamente pelo compilador.
O fato de Go não ser um objeto no sentido clássico significa que Go não possui herança de tipo e nenhuma subclasse. Isso torna possível contornar os problemas colocados por esses sistemas, como herança múltipla em linguagens que o permitem (em C ++ por exemplo) ou herança simples (em Java, por exemplo). Com a equivalência de tipo baseada em propriedade, Go não precisa de herança de tipo. A subclasse é emulada por "type boarding". Isso torna mais fácil misturar duas bases de código projetadas independentemente, sem ter que compartilhar tipos comuns.
A visibilidade de estruturas, atributos, variáveis, constantes, métodos, tipos de nível superior e funções fora de seu pacote de declaração é definida pelo caso do primeiro caractere de seus identificadores .
Go funciona em Unicode tanto para seu código-fonte quanto para seu processamento de strings. Sua literatura, entretanto, abandona os pontos de código da expressão para a abreviação de runas . Os procedimentos tornam possível transformar representações de caracteres em runas (qualquer runa ocupando um tamanho fixo) e transformar, por procedimentos padrão, uma série de caracteres Unicode em runas de um array (uma runa por elemento), bem como o contrário, sem ter que fazer malabarismos representações de comprimento variável ou se a máquina é little-endian ou big-endian . Portabilidade é, portanto, garantida.
Falar sobre runas evita as ambigüidades que estariam presentes com caracteres ou bytes . Para explorar uma cadeia, usamos as funções de cadeia diretamente ou navegamos de runa em runa.
A capitalização de caracteres nacionais (por exemplo "è" ⇒ "È") é feita simplesmente por unicode.ToUpper(r rune) rune. As runas permitem que você especifique em qualquer caractere Unicode, tailandês, chinês, grego, incluindo o idioma APL - e também qualquer emoticon encontrado lá.
No Go, o gerenciamento de memória é feito por um coletor de lixo .
Ainda não existe uma programação genérica, mesmo que os designers da linguagem estejam pensando nisso. Não há sobrecarga de método ou aritmética de ponteiro . Finalmente, não há afirmações ou exceções . Para substituir estes dois, GB fornece palavras-chave defer, panice recoverque fornecem mecanismos semelhantes a excepção língua sistemas de manuseamento, tais como C ++ e Java (palavras-chave try, catch, finallye throw).
Go pode fazer interface com bibliotecas C / C ++, desenvolvedores de terceiros que já desenvolveram ligações para SDL e MySQL .
Go define um formato de código padrão (em termos de indentações e apresentação de estruturas de controle) e fornece uma ferramenta para aplicá-lo (go fmt).
Go também oferece um sistema de documentação baseado em código e estrutura de teste.
A unidade de compilação de go é o pacote representado na implementação padrão por um diretório e os arquivos diretamente contidos nesse diretório.
A importação de um pacote é feita por seu caminho de importação e pode especificar uma biblioteca padrão ou também pacotes de terceiros instalados em repositórios de origem remotos (atualmente suportados: repositório em svn , git , mercurial e bazaar ).
Embora o objetivo inicial do Go seja produzir aplicativos de sistema robustos e não programas de usuário, os links para OpenGL estão sendo desenvolvidos em uma base experimental.
Como C, Go requer que você indique quais bibliotecas você usará. Ao contrário de C, ele considera a compilação como um erro se esta biblioteca não for usada. O compilador Go não contém, de fato, nenhuma mensagem de aviso por escolha dos designers: "Não é essencial indicar o que não seria essencial corrigir".
Bibliotecas principais:
As bibliotecas às vezes são independentes, às vezes dependentes. Existem também várias maneiras de fazer coisas semelhantes. Por exemplo, para ler um arquivo, você pode usar ioutil.ReadAll , file.Read () ou bufio.NewScanner () .
Obtemos a lista de bibliotecas na linha de comando de go list all.
Go permite chamadas recursivas de programas, o que às vezes pode torná-los mais legíveis, sem perda excessiva de velocidade:
package main import "fmt" import "time" var s [61]int func fib(n int) int { if n < 3 { return 1 } if s[n] != 0 { return s[n] } s[n] = fib(n-1) + fib(n-2) return s[n] } func main() { var i int t0 := time.Now() for i = 1; i <= 60; i++ { fmt.Printf("fib(%d) = %-15d\t", i, fib(i)) } println() println("Durée :", time.Since(t0).Seconds()) }Este programa é formatado da maneira padrão pelo utilitário gofmt com as opções -s (simplifique o código se possível) e -w (escreva o código modificado no local ). Este utilitário alinha os níveis de profundidade do programa, tornando a manutenção mais fácil, especialmente se vários desenvolvedores precisarem manter o mesmo código. Observe que ele não alinha verticalmente as chaves de abertura e fechamento, a maioria dos editores atuais (2018) sendo responsáveis por sinalizar visualmente as correspondências no modo de edição.
As escolhas sintáticas de Go não são unânimes. Se a linguagem afirma ser simplista em sua escrita, alguns a criticam por ter preconceitos muito impactantes e dogmáticos a esse respeito, qualificando sua sintaxe como confusa e seu compilador de rigidez questionável, citando, entre outros:
A linguagem foi criticada por ter "um motor Ferrari em uma carroceria Ford T".
Por outro lado, Go propõe simplificar a sintaxe de C, intencionalmente mantida em C ++ para garantir compatibilidade com versões anteriores, por exemplo, removendo os parênteses sintaticamente desnecessários atrás de ife de for, propondo uma falha padrão em a switch, etc. Essas mudanças podem fornecer programas mais legíveis.
Lista de aplicativos gratuitos notáveis escritos em Go: