Articles

Go (linguagem de programação)

Posted by admin

Go é influenciado por C, mas com ênfase em maior simplicidade e segurança. A língua consiste de:

  • Uma sintaxe e ambiente de adotar padrões mais comuns em linguagens dinâmicas:
    • Opcional concisa declaração de variável e a inicialização através de inferência de tipo (x := 0 em vez de int x = 0; ou var x = 0;).compilação rápida.
    • Gestão Remota de pacotes (go get) e documentação de pacotes online., abordagens distintivas para problemas particulares: primitivos embutidos em concorrência: processos leves (goroutinas), canais, e a declaração de

      .

    • um sistema de interface no lugar da herança virtual, e incorporação de tipo em vez de herança não-virtual.
    • uma barra de ferramentas que, por padrão, produz binários nativos com ligações estáticas sem dependências externas.,
  • um desejo de manter a especificação da linguagem simples o suficiente para manter na cabeça de um programador, em parte omitindo características que são comuns em línguas similares.

SyntaxEdit

go’s syntax includes changes from C aimed to keeping code concise and readable. Um operador combinado de declaração/inicialização foi introduzido que permite ao programador escrever i := 3 ou s := "Hello, world!", sem especificar os tipos de variáveis utilizadas. This contrasts with c’sint i = 3; andconst char *s = "Hello, world!";., Semicolons ainda terminam as declarações, mas estão implícitas quando o fim de uma linha ocorre. Métodos podem retornar vários valores, e retornar um id

par é a maneira convencional que um método indica um erro para o seu chamador em Go. Go adiciona sintaxas literais para inicializar parâmetros de estruturação pelo nome e para inicializar mapas e fatias. Como uma alternativa para C ‘S three-statementforloop, Go’srangeexpressões permitem iteração concisa sobre arrays, fatias, cadeias de caracteres, mapas e canais.,

TypesEdit

para cada tipo T e cada constante inteira não-negativa n, Há um tipo de array denotado T; arrays de diferentes comprimentos são, portanto, de diferentes tipos. Arrays dinâmicos estão disponíveis como” fatias”, denotado T para algum tipo T. Estes têm um comprimento e uma capacidade especificando quando a nova memória precisa ser alocada para expandir o array. Várias fatias podem compartilhar sua memória subjacente.

Pointers are available for all types, and the pointer-to-T type is denoted *T., Address-taking and indirection use the & and * operators, as in C, or happen implicitly through the method call or attribute access syntax. Não há aritmética de ponteiros, exceto através do especial inseguro.Tipo de ponteiro na biblioteca padrão.

para um par de tipos K, V, o tipo mapV é o tipo de tabelas de hash mapeando chaves tipo-K para os valores tipo-V. Tabelas de Hash são construídas na linguagem, com sintaxe especial e funções embutidas. chan T é um canal que permite o envio de valores do tipo T entre os processos de Go simultâneos.,

além de seu suporte para interfaces, o sistema de tipo de Go é nominal: a palavra-chave de tipo pode ser usada para definir um novo tipo nomeado, que é diferente de outros tipos nomeados que têm o mesmo layout (no caso de uma estrutura, os mesmos membros na mesma ordem). Algumas conversões entre tipos (por exemplo, entre os vários tipos inteiros) são pré-definidas e adicionar um novo tipo pode definir conversões adicionais, mas conversões entre tipos nomeados devem sempre ser invocadas explicitamente., Por exemplo, a palavra-chave tipo pode ser usada para definir um tipo para endereços IPv4, baseado em inteiros sem sinal de 32 bits:

type ipv4addr uint32

com esta definição de tipo, ipv4addr(x) interpreta o valor x uint32 como um endereço IP. Simplesmente atribuir x a uma variável do tipo ipv4addr é um erro de tipo.

As expressões constantes podem ser dactilografadas ou” não tipadas”; é-lhes dado um tipo quando atribuído a uma variável tipada se o valor que representam passar por uma verificação de tempo de compilação.,

tipos de funções são indicados pela palavra-chave do func; eles tomam zero ou mais parâmetros e retornam zero ou mais Valores, todos os quais são digitados. O parâmetro e os valores de retorno determinam um tipo de função; assim, func (string, int32) (int, error) é o tipo de funções que tomam uma string e um inteiro assinado de 32-bit, e retornam um inteiro assinado (de largura padrão) e um valor do erro do tipo de interface embutido.

qualquer tipo nomeado tem um conjunto de métodos associado a ele., O exemplo do endereço IP acima pode ser estendido com um método para verificar se o seu valor é uma norma conhecida:

// ZeroBroadcast reports whether addr is 255.255.255.255.func (addr ipv4addr) ZeroBroadcast() bool { return addr == 0xFFFFFFFF}

devido à tipagem nominal, esta definição do método adiciona um método ao ipv4addr, mas não ao uint32. Embora os métodos tenham uma definição especial e uma sintaxe de chamada, não há nenhum tipo de método distinto.

Interface systemEdit

Go fornece duas características que substituem a herança de classe.

A primeira é a incorporação, que pode ser vista como uma forma automatizada de composição ou delegação.,: 255

o segundo são suas interfaces, que fornecem polimorfismo em tempo de execução.: 266 Interfaces são uma classe de tipos e fornecem uma forma limitada de tipagem estrutural no outro tipo de sistema nominal de Go. Um objeto que é de um tipo de interface também é de outro tipo, muito parecido com objetos C++ sendo simultaneamente de uma classe base e derivada. As interfaces Go foram projetadas após protocolos da linguagem de programação Smalltalk. Várias fontes usam o termo “duck typing” ao descrever interfaces Go., Embora o termo dactilografia de pato não seja definido com precisão e, portanto, não esteja errado, geralmente implica que a conformidade do tipo não é controlada estaticamente. Uma vez que a conformidade com uma interface Go é verificada estaticamente pelo compilador Go (exceto quando se executa uma asserção de tipo), os autores Go preferem o termo tipagem estrutural.

A definição de um tipo de interface lista os métodos necessários por nome e tipo. Qualquer objeto do tipo T para o qual existam funções correspondentes a todos os métodos necessários de interface tipo I é um objeto do tipo I também. A definição de Tipo T não precisa (e não pode) identificar o tipo I., Por exemplo, se a forma, o quadrado e o círculo são definidos como

então tanto um quadrado como um círculo são implicitamente uma forma e podem ser atribuídos a uma variável de formato tipado.: 263-268 In formal language, Go’s interface system provides structural rather than nominal typing. Interfaces podem incorporar outras interfaces com o efeito de criar uma interface combinada que é satisfeita exatamente pelos tipos que implementam a interface embutida e quaisquer métodos que a interface recém-definida adiciona.,: 270

A Biblioteca Padrão Go usa interfaces para fornecer genicidade em vários lugares, incluindo o sistema de entrada/saída que é baseado nos conceitos de leitor e escritor.: 282-283

além de métodos de chamada via interfaces, Go permite converter os valores de interface para outros tipos com uma verificação de tempo de execução do tipo. As construções de linguagem para fazê-lo são a afirmação de tipo, que verifica contra um único tipo potencial, e o interruptor de tipo, que verifica contra vários tipos.,

a interface vazia interface{} é uma importante base porque pode referir-se a um item de qualquer tipo concreto. É semelhante à classe de objetos em Java ou C# e é satisfeito por qualquer tipo, incluindo tipos embutidos como int.:284 do Código usando o vazio interface não pode simplesmente chamar métodos (ou operadores) sobre o referido objeto, mas ele pode armazenar o interface{} valor, tente convertê-lo para um mais útil, tipo através de um tipo de exercício ou o tipo de interruptor, ou inspecioná-lo com Go reflect pacote., Como interface{} pode se referir a qualquer valor, é uma forma limitada de escapar das restrições de tipagem estática, comovoid* em C, mas com verificações adicionais de tipo de tempo de execução.

O interface{}tipo pode ser usado para modelar dados estruturados de qualquer esquema arbitrário no Go, como dados JSON ou YAML, representando-o como ummapinterface{} (mapa de cadeia para interface vazia). Isto descreve recursivamente dados na forma de um dicionário com chaves de cadeia e valores de qualquer tipo.,

os valores da Interface são implementados usando ponteiro para os dados e um segundo ponteiro para executar a informação do tipo tempo. Como alguns outros tipos implementados usando ponteiros em Go, os valores da interface são nil se não estiver inicializado.

Pacote de systemEdit

Em um sistema de pacotes, cada pacote tem um caminho (por exemplo, "compress/bzip2" ou "golang.org/x/net/html") e um nome (por exemplo, bzip2 ou html)., As referências às definições de outros pacotes devem ser sempre prefixadas com o nome do outro pacote, e apenas os nomes capitalizados de outros pacotes são acessíveis: io.Reader é público, mas bzip2.reader não é. go get comando pode obter os pacotes armazenados em um repositório remoto e desenvolvedores são encorajados a desenvolver pacotes dentro de um caminho de base correspondente a um repositório de código-fonte (como exemplo.,com/user_name / package_name) para reduzir a probabilidade de colisão de nome com futuras adições à biblioteca padrão ou outras bibliotecas externas.

existem propostas para introduzir uma solução adequada de gerenciamento de pacotes para Go semelhante ao CPAN para o sistema de carga de Perl ou Rust ou sistema de nó npm.

concurrencia: goroutines and channelsEdit

a linguagem Go tem instalações incorporadas, bem como suporte à biblioteca, para escrever programas concorrentes., Concurrencia refere-se não só ao paralelismo de CPU, mas também a asynchrony: deixar as operações lentas como um banco de dados ou rede de leitura executar enquanto o programa faz outro trabalho, como é comum em servidores baseados em eventos.

a construção de concorrência primária é a goroutina, um tipo de processo leve. Uma chamada de função prefixada com o id

palavra-chave inicia uma função em um novo goroutino., A especificação da linguagem não especifica como goroutines devem ser implementadas, mas implementações atuais multiplexam goroutines de um processo Go em um conjunto menor de threads do sistema operacional, semelhante ao agendamento realizado em Erlang.: 10

While a standard library package featuring most of the classical concurreency control structures (mutex locks, etc.) is available,: 151-152 idiomatic simultaneous programs instead prefer channels, which provide send messages between goroutines., Buffers opcionais armazenam mensagens na ordem FIFO: 43 e permitem o envio de goroutinas para prosseguir antes de suas mensagens serem recebidas.

os Canais são digitados, para que um canal do tipo chan T só pode ser utilizado para transferir mensagens do tipo T. sintaxe Especial é usado para operar sobre eles; <-ch é uma expressão que faz com que a execução goroutine para bloquear até um valor vem através do canal ch, enquanto ch <- x envia o valor de x (possivelmente bloqueando até outro goroutine recebe o valor)., A instrução de seleção incorporada pode ser usada para implementar a comunicação não-bloqueante em vários canais; veja abaixo para um exemplo. Go tem um modelo de memória descrevendo como goroutines deve usar canais ou outras operações para compartilhar dados com segurança.

a existência de canais distingue-se das linguagens concorrentes ao estilo ator modelo, como Erlang, onde as mensagens são direcionadas diretamente aos atores (correspondendo a goroutines)., O estilo ator pode ser simulado em Go, mantendo uma correspondência um-para-um entre goroutines e canais, mas a linguagem permite que vários goroutines para compartilhar um canal ou um único goroutine para enviar e receber em vários canais.: 147

a partir destas ferramentas pode-se construir construções simultâneas como piscinas de trabalhadores, pipelines (em que, por exemplo, um arquivo é descomprimido e processado como ele downloads), chamadas de fundo com tempo-limite, “fan-out” chamadas paralelas para um conjunto de serviços, e outros., Canais também encontraram usos mais distantes da noção usual de comunicação interprocess, como servir como uma lista de buffers reciclados, implementando coroutinas (que ajudaram a inspirar o nome goroutine), e implementando iteradores.

Concurrencial-related structural conventions of Go (channels and alternative channel inputs) are derived from Tony Hoare’s communicating sequential processes model., Ao contrário de linguagens de programação concorrentes anteriores, como Occam ou Limbo (uma linguagem na qual o co-designer Go Rob Pike trabalhou), Go não fornece qualquer noção embutida de concorrência Segura ou verificável. Enquanto o modelo de processos de comunicação é favorecido no Go, não é o único: todas as goroutinas em um programa compartilham um único espaço de endereçamento. Isto significa que objetos mutáveis e ponteiros podem ser compartilhados entre goroutinas; ver § falta de segurança da condição de raça, abaixo.,

idoneidade para programadores paralelos

embora as características de concorrência de Go não sejam destinadas principalmente ao processamento paralelo, elas podem ser usadas para programar Máquinas Multi-processadores de memória compartilhada. Foram realizados vários estudos sobre a eficácia desta abordagem. Um desses estudos comparou o tamanho (em linhas de código) e a velocidade dos programas escritos por um programador experiente não familiarizado com a linguagem e correções desses programas por um especialista da Go (da equipe de desenvolvimento do Google), fazendo o mesmo para Chapel, Cilk e Intel TBB., The study found that the non-expert tended to write divide-and-conquer algorithms with one go statement per recursion, while the expert wrote distribute-work-synchronize programs using one goroutine per processor. Os programas do especialista eram geralmente mais rápidos, mas também mais longos.

falta de condições de corrida safetyEdit

não há restrições sobre como goroutines acessar dados compartilhados, tornando as condições de corrida possível., Especificamente, a menos que um programa explicitamente sincronize através de canais ou outros meios, as escritas de um goroutine podem ser parcialmente, inteiramente, ou de modo algum visíveis para outro, muitas vezes sem garantias sobre a ordenação de escritas. Além disso, as estruturas internas de dados de Go como os valores de interface, cabeçalhos de corte, Tabelas de hash e cabeçalhos de string não são imunes às condições de corrida, então a segurança de tipo e memória pode ser violada em programas multithreaded que modificam instâncias compartilhadas desses tipos sem sincronização., Em vez de suporte de linguagem, programação concorrente segura, assim, depende de Convenções; por exemplo, Chisnall recomenda um idioma chamado “pseudônimos xor mutável”, o que significa que passar um valor mutável (ou ponteiro) sobre um canal sinaliza uma transferência de propriedade sobre o valor para o seu receptor.: 155

BinariesEdit

o linker na barra de ferramentas GC cria binários estaticamente ligados por padrão, portanto todos os binários Go incluem o tempo de execução Go.,

OmissionsEdit

Go deliberadamente omite certas características comuns em outras linguagens, incluindo (implementação) herança, programação genérica, afirmações, aritmética de ponteiros, conversões de tipo implícitas, uniões não marcadas e uniões marcadas. Os designers adicionaram apenas as instalações que todos os três concordaram.,

das características da linguagem omitida, os designers explicitamente argumentam contra asserções e aritmética de ponteiros, enquanto defendem a escolha de omitir herança de tipo como dando uma linguagem mais útil, encorajando em vez disso o uso de interfaces para alcançar envio dinâmico e composição para reutilizar o código. A composição e a delegação são, de facto, em grande medida automatizadas pela incorporação de estruturas; de acordo com os investigadores Schmager et al., Esta característica “tem muitas das desvantagens da herança: afeta a interface pública de objetos, não é de grão fino (I.,e, no method-level control over embedding), methods of embedded objects cannot be hidden, and it is static”, making it “not obvious” whether programmers will overuse it to the extent that programmers in other languages are reputed to overuse inheritance.

os designers expressam uma abertura para a programação genérica e note que as funções incorporadas são de fato tipo-genérico, mas estes são tratados como casos especiais; Pike chama isso de uma fraqueza que pode em algum momento ser alterada. A equipe do Google construiu pelo menos um compilador para um dialeto experimental Go com genéricos, mas não o lançou., Eles também estão abertos a padronizar formas de aplicar a geração de código. Em junho de 2020, um novo projeto de documento de design foi publicado, que adicionaria a sintaxe necessária para declarar funções e tipos genéricos. Uma ferramenta de tradução de código go2go foi fornecida para permitir que os usuários experimentassem a nova sintaxe, juntamente com uma versão ativada pelos genéricos do Playground online Go.,

Inicialmente omitido, a exceção-como pânico/mecanismo de recuperação foi eventualmente adicionado, o qual Ir autores aconselham utilizar para erros irrecuperáveis, tais como aqueles que deveriam parar um programa inteiro ou a pedido do servidor, ou como um atalho para propagar erros a pilha dentro de um pacote (mas não em toda pacote de fronteiras; lá, retorna erro são a norma API).

Leave A Comment