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

Olá pessoal! Hoje, compartilhamos a parte final da tradução do artigo “O que é e o que não está no Go”. Lembramos que, na primeira parte , falamos sobre os elementos que estão no Go, hoje falaremos sobre o que não está no Go.

A tradução deste material foi preparada antecipando o início de um novo fluxo no curso Golang Developer .



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.




Itens não encontrados em Go


Conversão implícita de números


Na programação, a conversão de tipos envolve a alteração do tipo de dados de um objeto para outro. Conversão implícita significa que essa alteração é feita automaticamente pelo intérprete ou compilador. Por exemplo, atribuindo um valor int a uma variável que foi atribuída anteriormente a um valor de ponto flutuante. Esta conversão não está disponível no Go. Quando um tipo não é mencionado ao declarar uma variável, é atribuído um tipo adequado, por exemplo, int, float, string, etc., com base na sintaxe do literal. No exemplo abaixo, o Go lançará um erro porque encontrará dois tipos de dados diferentes e não poderá trabalhar com eles. Isso acontece porque o compilador Go converte implicitamente int em float64 .

 a := 1.0 // same as float64(1.0) b := 1 // same as int(1) fmt.Printf("%f", a*b) // invalid operation: a * b (mismatched types float64 and int) 

Construtores e destruidores


A tarefa dos projetistas é o processamento primário e a inicialização do objeto, e o destruidor é destruir o objeto após sua vida útil e liberdade de memória. Ao contrário de outros paradigmas orientados a objetos, não existem classes no Go. Portanto, o conceito de construtores e destruidores também não existe.

Sobrecarga do operador


Sobrecarga de operador é a maneira pela qual os operadores podem executar operações definidas pelo usuário. Os operadores se comportam de acordo com os argumentos passados. Por exemplo, em C ++ + operador pode ser usado para combinar seqüências de caracteres e adicionar dois números inteiros. O valor “+” também pode ser definido pelo usuário e alterado de acordo com as necessidades do programa. Em JavaScript, uma operação do tipo '1' + 1 resultará na saída da sequência "11" devido à maior prioridade das sequências. Tais definições não são permitidas no Go, os operadores trabalham estritamente e executam operações apenas com certos tipos de dados de argumentos.

Valores padrão


O Go não permite padrões nos protótipos de funções ou quando as funções estão sobrecarregadas. A especificação do idioma Go é incomumente pequena e é suportada especificamente para simplificar a análise. Diferente de outros idiomas, nos quais você pode passar valores padrão / parâmetros opcionais para uma função, no Go, você só pode verificar se um valor foi passado. Uma abordagem diferente para os valores padrão no Go seria algo como isto.

 func Concat1(a string, b int) string { if a == "" { a = "default-a" } if b == 0 { b = 5 } return fmt.Sprintf("%s%d", a, b) } 

Herança


Como o Go não segue a hierarquia familiar de classes de programação orientada a objetos, as estruturas no Go não são herdadas uma da outra. Em geral, herança é um procedimento nas linguagens OOP, em que uma classe herda as propriedades e o método de classe de seus pais. A herança pode se aprofundar em vários níveis. No entanto, no Go, uma estrutura pode ser compilada simplesmente fornecendo um ponteiro ou incorporando estruturas colaborativas. Um exemplo de composição no Go é dado abaixo. A substituição de classes pode ser uma interface no Go. As interfaces existem em outros idiomas, mas as interfaces Go são implicitamente satisfeitas.

 type TokenType uint16 type Token struct { Type TokenType Data string } type IntegerConstant struct { Token *Token Value uint64 } 

Programação geral


A programação genérica é uma forma na qual conectamos padrões conhecidos como genéricos, que não são realmente o código-fonte verdadeiro, mas são compilados pelo compilador para convertê-los em código-fonte. Vamos tentar entender os padrões de uma maneira simples. Pense em padrões na programação como um formulário. Criamos um formulário no qual detalhes importantes do modelo são deixados em branco e precisam ser preenchidos posteriormente durante a compilação. Então, quando precisamos criar algo a partir desse modelo, simplesmente especificamos os detalhes, por exemplo, o tipo.

 template<typename T> class MyContainer { // Container that deals with an arbitrary type T }; void main() { // Make MyContainer take just ints. MyContainer<int> intContainer; } 

O trecho acima é escrito em C ++. O modelo não é fornecido com um tipo, mas é fornecido quando o MyContainer é inicializado. Também podemos especificar outros tipos, como float , double , etc., de acordo com nossas necessidades. Modelos generalizados são úteis ao executar algoritmos em um conjunto de dados de vários tipos.

Exceções


Uma exceção indica uma condição razoável que o aplicativo pode querer interceptar. Por meio de exceções, podemos resolver situações nas quais o programa pode não funcionar. Uma exceção verificada não leva a uma parada completa da execução; pode ser interceptada e processada. O Go não tem exceções; ele possui apenas erros como interfaces e erros internos. A principal diferença entre erros e exceções é que eles indicam um problema sério e devem ser resolvidos imediatamente, para que a programação Go se torne mais rigorosa. Os erros no Go precisam ser verificados explicitamente à medida que ocorrem.

Macros


Macros são comandos de macro. Essa é uma maneira de minimizar tarefas repetitivas de programação, definindo uma saída predefinida para um determinado conjunto de entradas. Por exemplo, se queremos obter o quadrado de um número em C, podemos simplesmente escrever x * x , onde x é uma variável, mas também podemos definir uma macro que retorne o quadrado de um número toda vez que precisarmos. Macros não são funções. Macros não estão disponíveis no Go.

 #define square(x) ((x) * (x)) int main() { int four = square(2); // same as 2 * 2 return 0; } 

Anotações de recursos


As anotações são uma maneira de associar metadados a parâmetros de função. No Python, as anotações são sintaticamente suportadas e são completamente opcionais. Vejamos um pequeno exemplo para descrever anotações em Python.

 def foo(a: int, b: 'description', c: float) -> float: print(a+b+c) foo(1, 3, 2) // prints 6.0 foo('Hello ', , 'World!') // prints Hello World! 

No código acima, os parâmetros a , b c anotados com alguns metadados. a e c anotados c tipos int e float , enquanto b fornecido com uma descrição da string. foo imprimirá uma saída específica, apesar do tipo de argumento mencionado nas anotações.

Armazenamento de fluxo local


O armazenamento de fluxo local é um método de programação de computador que usa memória estática ou global localizada em um fluxo. Esta é uma área estática em que os dados são copiados para cada fluxo no programa. Quando vários fluxos usam os mesmos dados estáticos para a mesma tarefa, eles podem copiá-los do armazenamento local em vez de armazená-los por conta própria.

Conclusão


A Go se concentrou na simplicidade e elegância. Possui sintaxe rápida, pequena e simples. Ao contrário de outras linguagens de POO, ele tem menos conceitos que devem ser depositados na cabeça. Os criadores do Go escolheram a simplicidade do idioma sem adicionar complexidade multiplicativa às partes adjacentes do idioma. Portanto, o Go não possui recursos que tornam o analisador mais lento e maior. Simplicidade é a chave para um bom software.
NOTA Os trechos de código deste artigo são copiados de vários artigos na Internet.
Só isso.

Leia a primeira parte

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


All Articles