Qué es y qué no está en Go. Parte 2

Hola a todos! Hoy compartimos la parte final de la traducción del artículo "Qué es y qué no está en Go". Le recordamos que en la primera parte hablamos sobre los elementos que están en Go, hoy hablaremos sobre lo que no está en Go.

Se preparó una traducción de este material en previsión del inicio de una nueva transmisión en el curso para desarrolladores de Golang .



Go fue creado con una mirada hacia atrás, y su paquete básico está muy bien compuesto: tiene recolección de basura, paquetes, funciones de primera clase, alcance léxico, interfaz de llamada del sistema y líneas inmutables, cuyo texto generalmente está codificado en UTF-8. Pero tiene relativamente pocas características y es poco probable que aumente su número. Por ejemplo, no tiene conversiones numéricas implícitas, sin constructores o destructores, sin sobrecargas de operadores, sin valores de parámetros predeterminados, sin herencia, sin genéricos, sin excepciones, sin macros, sin anotaciones de funciones y sin almacenamiento de flujo local.




Artículos no encontrados en Go


Conversión de número implícito


En la programación, la conversión de tipos implica cambiar el tipo de datos de un objeto a otro. La conversión implícita significa que este cambio lo realiza automáticamente el intérprete o el compilador. Por ejemplo, asignar un valor int a una variable a la que previamente se le asignó un valor de coma flotante. Esta conversión no está disponible en Go. Cuando no se menciona un tipo al declarar una variable, se le asigna un tipo adecuado, por ejemplo, int, float, string, etc., en función de la sintaxis del literal. En el siguiente ejemplo, Go arrojará un error porque encontrará dos tipos de datos diferentes y no podrá trabajar con ellos. Esto sucede porque el compilador Go convierte implícitamente int en 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) 

Constructores y destructores


La tarea de los diseñadores es el procesamiento primario y la inicialización del objeto, y el destructor es destruir el objeto después de su vida útil y memoria libre. A diferencia de otros paradigmas orientados a objetos, no hay clases en Go. Por lo tanto, el concepto de constructores y destructores tampoco existe.

Sobrecarga del operador


La sobrecarga del operador es la forma en que los operadores pueden realizar operaciones definidas por el usuario. Los operadores se comportan de acuerdo con los argumentos pasados. Por ejemplo, en C ++ + operador puede usarse para combinar cadenas, así como para agregar dos enteros. El valor "+" también puede ser definido por el usuario y modificado según las necesidades del programa. En JavaScript, una operación como '1' + 1 conducirá a la salida de la cadena "11" debido a la mayor prioridad de las líneas. Dichas definiciones no están permitidas en Go, los operadores trabajan estrictamente y realizan operaciones solo con ciertos tipos de datos de argumentos.

Valores por defecto


Go no permite valores predeterminados en los prototipos de funciones o cuando las funciones están sobrecargadas. La especificación del lenguaje Go es inusualmente pequeña y específicamente compatible para simplificar el análisis. A diferencia de otros idiomas, donde puede pasar valores predeterminados / parámetros opcionales a una función, en Ir solo puede verificar si se ha pasado un valor. Un enfoque diferente a los valores predeterminados en Go sería algo como esto.

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

Herencia


Como Go no sigue la jerarquía familiar de clases de programación orientada a objetos, las estructuras en Go no se heredan entre sí. En general, la herencia es un procedimiento en lenguajes OOP en el que una clase hereda las propiedades y el método de clase de sus padres. La herencia puede profundizar en varios niveles. Sin embargo, en Go, una estructura puede compilarse simplemente proporcionando un puntero o incrustando en estructuras colaborativas. Un ejemplo de composición en Go se da a continuación. El reemplazo de clases puede ser interfaces en Go. Las interfaces existen en otros idiomas, pero las interfaces Go están implícitamente satisfechas.

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

Programación general


La programación genérica es una forma en la que conectamos patrones conocidos como genéricos, que en realidad no son el código fuente verdadero, pero el compilador los compila para convertirlos en código fuente. Tratemos de entender los patrones de una manera simple. Piense en los patrones de programación como una forma. Creamos un formulario en el que los detalles importantes de la plantilla se dejan en blanco y deben completarse más tarde durante la compilación. Luego, cuando necesitamos crear algo a partir de esta plantilla, simplemente especificamos los detalles, por ejemplo, tipo.

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

El fragmento anterior está escrito en C ++. La plantilla no se proporciona con un tipo, pero se proporciona cuando se inicializa MyContainer. También podemos especificar otros tipos, como float , double , etc., según nuestras necesidades. Las plantillas generalizadas son útiles cuando se ejecutan algoritmos en un conjunto de datos de varios tipos.

Excepciones


Una excepción indica una condición razonable que la aplicación podría querer interceptar. A través de excepciones, podemos resolver situaciones en las que el programa puede no funcionar. Una excepción marcada no conduce a una detención completa de la ejecución; puede ser interceptada y procesada. Go no tiene excepciones; solo tiene errores como interfaces y errores incorporados. La diferencia clave entre errores y excepciones es que indican un problema grave y deben resolverse de inmediato, por lo que la programación de Go se vuelve más estricta. Los errores en Go deben verificarse explícitamente a medida que ocurren.

Macros


Las macros son comandos macro. Esta es una forma de minimizar las tareas de programación repetitivas mediante la definición de una salida predefinida para un conjunto dado de entradas. Por ejemplo, si queremos obtener el cuadrado de un número en C, simplemente podemos escribir x * x , donde x es una variable, pero también podemos definir una macro que devuelva el cuadrado de un número cada vez que lo necesitemos. Las macros no son funciones. Las macros no están disponibles en Go.

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

Anotaciones de funciones


Las anotaciones son una forma de asociar metadatos con parámetros de funciones. En Python, las anotaciones son sintácticamente compatibles y son completamente opcionales. Veamos un pequeño ejemplo para describir anotaciones en 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! 

En el código anterior, los parámetros a , c anotados con algunos metadatos. c anotados c int y float , mientras que b una descripción de cadena. foo imprimirá resultados específicos, a pesar del tipo de argumentos mencionados en las anotaciones.

Almacenamiento de flujo local


El almacenamiento de flujo local es un método de programación de computadora que utiliza memoria estática o global localizada en un flujo. Esta es un área estática donde los datos se copian para cada flujo en el programa. Cuando varias transmisiones usan los mismos datos estáticos para la misma tarea, pueden copiarlas del almacenamiento de transmisiones local en lugar de almacenarlas por su cuenta.

Conclusión


Go se ha centrado en la simplicidad y la elegancia. Tiene una sintaxis rápida, pequeña y simple. A diferencia de otros lenguajes OOP, tiene menos conceptos que deben depositarse en la cabeza. Los creadores de Go eligieron la simplicidad del lenguaje sin agregar complejidad multiplicativa a las partes adyacentes del lenguaje. Por lo tanto, Go no tiene características que hagan que el analizador sea más lento y más grande. La simplicidad es la clave del buen software.
NOTA Los fragmentos de código de este artículo se copian de varios artículos en Internet.
Eso es todo.

Lee la primera parte

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


All Articles