O que é e o que não está no Go. Parte 1

Olá pessoal, na véspera do início de um novo tópico no curso "Golang Developer", queremos compartilhar com você uma tradução de um artigo interessante, na primeira parte da qual entendemos os elementos que estão no Go. Vamos lá



O Go foi criado com uma retrospectiva, e seu pacote básico é realmente bem composto: possui coleta de lixo, pacotes, funções de primeira classe, escopo lexical, interface de chamada do sistema e linhas imutáveis, cujo texto geralmente é codificado em UTF-8. Mas tem relativamente poucos recursos e é improvável que aumente seu número. Por exemplo, ele não possui conversões numéricas implícitas, construtores ou destruidores, sobrecargas de operadores, valores de parâmetros padrão, herança, genéricos, exceções, macros, anotações de funções e armazenamento de fluxo local.

Antes de ler : Acima está um trecho do livro de Alan A. A. Donovan e Brian W. Kernigan, “Go Programming Language”. página xiv. Os itens mencionados abaixo são uma explicação breve e um tanto incompleta dos termos usados ​​no design de uma linguagem de programação. Eu tentei explicar todos os conceitos em termos de programação no Go. Todos os pontos mencionados abaixo não são de minha autoria, são retirados de outros extratos. Não protejo de forma alguma o Go ou qualquer outro idioma.

Agora tentaremos entender cada termo em breve. Para um iniciante em programação geral, conhecer esses termos é muito importante. O significado de todos esses conceitos é aplicável em todas as linguagens de programação. Esses termos podem ajudá-lo a distinguir entre diferentes idiomas em um nível fundamental.

Elementos que estão no Go


Coleta de lixo


Esse mecanismo está presente em qualquer linguagem de programação que execute o gerenciamento automático de memória. Para entender a coleta de lixo ou o gerenciamento de memória, primeiro você precisa entender como a própria memória funciona. Ao trabalhar com uma linguagem de programação, o compilador atribui vários espaços de memória no sistema para armazenar dados, por exemplo, criando uma variável, fazendo um loop através de uma matriz, etc. Alocação e redistribuição de memória devem ser implementadas para tornar o programa trabalhar com memória mais eficiente.

Em um idioma como C, a memória é gerenciada manualmente. Se você está familiarizado com C, sabe que existe uma função malloc que aloca dinamicamente memória no sistema. Em uma linguagem de alto nível, como JavaScript ou Python, essa alocação é realizada automaticamente por um programa conhecido como coletor de lixo. Como o nome indica, seu trabalho é gerenciar a memória, alocar espaço quando necessário e liberar memória alocada quando não houver mais. Go implementa a coleta de lixo, para que o programador não precise se preocupar com o gerenciamento de memória.

Pacotes


Empacotar é a combinação de todo o código-fonte e recursos em um objeto chamado pacote. O pacote de software é conveniente de várias maneiras, como fácil instalação, compartilhamento, adição, depuração etc. A Go possui um sistema de pacotes integrado que integra documentação, binários e arquivos de código-fonte. O objetivo do empacotamento é usar outros projetos de software no seu software sem ter que copiar manualmente o código-fonte.

Funções de primeira classe


Uma função de primeira classe é uma função que pode ser processada como qualquer outra variável, ou seja, pode ser atribuída, retornada, exportada, passada como parâmetro, etc. Veja o seguinte trecho escrito em Ir. A função que imprime a string hello world first class function atribuída à variável a . A variável a se comporta como um valor real na memória, no entanto, também pode ser chamada como uma função adicionando () no final. Você também pode ver que o valor de a é exibido da mesma maneira que qualquer outra variável. Este é o conceito básico de funções de primeira classe.

 package main import ( "fmt" ) func main() { a := func() { fmt.Println("hello world first class function") } a() fmt.Printf("%T", a) } 

Âmbito lexical


Um escopo em um programa é semelhante a um bloco ou escopo no qual a definição de qualquer variável / função é válida. Por exemplo, uma variável declarada dentro de uma função retém seu valor somente dentro desse bloco de funções, ou seja, entre chaves {} . Se você tentar acessar o valor de uma variável fora deste bloco de funções, o programa não poderá encontrá-lo.

 package main import “fmt” func main() { { v := 1 { fmt.Println(v) } fmt.Println(v) } fmt.Println(v) // “undefined: v” compilation error } 

No fragmento dado, existem quatro áreas de visibilidade. O primeiro é a região global, o segundo é a função main () , o terceiro é o primeiro bloco dentro da função main e o quarto é a região em que fmt.Println é chamado pela primeira vez. Dos três Println último gera um erro de compilação. Isso ocorre porque a definição da variável v está disponível apenas nas áreas três e quatro. Quando Println é chamado com v passado como parâmetro, o programa primeiro procura sua definição na área atual; quando não consegue encontrá-la, move-se para fora no escopo do pai e continua fazendo isso até encontrar sua definição. Esse é o escopo lexical - o programa começa a procurar a definição de variáveis ​​e funções da área em que são usadas / chamadas e sai. No último programa fmt.Println , não foi possível encontrar a definição de v na área atual ou em nenhuma área pai, portanto, gera um erro de compilação.

Interface de chamada do sistema


O Go vem com uma interface de chamada do sistema que serve como referência às chamadas do sistema disponíveis para o sistema operacional. Por exemplo, abrir e ler um arquivo, entrada e saída, etc. Intercepta chamadas de função na API e chama a chamada do sistema necessária no sistema operacional.

Cordas imutáveis


Embora a sintaxe de Go seja semelhante a C, ela tem uma vantagem sobre ela na forma de linhas imutáveis ​​que são codificadas em UTF-8. Ou seja, os programas escritos no Go podem formar cadeias de caracteres usando muitos idiomas e caracteres. Em um sentido simples, as strings são uma combinação / matriz / lista de caracteres nas linguagens de programação. Como as seqüências de caracteres são formadas pela combinação de caracteres, sua composição pode ser alterada. Caracteres podem ser adicionados, excluídos, movidos, etc. Consideramos um método que garante a imutabilidade de uma string depois que ela é declarada. O conceito de strings imutáveis ​​não é novo; nas instâncias do Python, os objetos não podem ser alterados, o JavaScript também possui strings imutáveis ​​e Ruby adicionou Literals de Strings Congelados no 2.3. Mas, no entanto, muitas linguagens populares, como C ++, PHP, Perl, etc., não possuem sequências imutáveis.

Então, com isso, a primeira parte do artigo chegou ao fim. Nele, os elementos que estão no Go foram desmontados e, sobre o que não está no Go, você pode ler na segunda parte do artigo .

Source: https://habr.com/ru/post/pt463461/


All Articles