Go (lenguaje de programación)

De Wikipedia, la enciclopedia libre
Ir a la navegación Ir a la búsqueda
Go
Go Logo Blue.svg
Desarrollador(es)
Google
https://golang.org y https://go.dev
Información general
Extensiones comunes .go
Paradigma compilado concurrente, imperativo, estructurado[1][2][3]
Apareció en 2009
Diseñado por Robert Griesemer, Rob Pike y Ken Thompson
Última versión estable 1.15.2 [4](10 de septiembre de 2020 (4 meses y 2 días))
Sistema de tipos fuerte, estático
Implementaciones gc (8g, 6g, 5g), gccgo
Influido por C, Modula-2, Pascal, Oberon, Limbo
Sistema operativo GNU/Linux, Mac OS X, Windows, otros[5][6]
Licencia BSD[7]​ + patent grant[8]

Go es un lenguaje de programación concurrente y compilado inspirado en la sintaxis de C, que intenta ser dinámico como Python y con el rendimiento de C o C++. Ha sido desarrollado por Google[9]​ y sus diseñadores iniciales fueron Robert Griesemer, Rob Pike y Ken Thompson. [10]​ Actualmente está disponible en formato binario para los sistemas operativos Windows, GNU/Linux, FreeBSD y Mac OS X, pudiendo también ser instalado en estos y en otros sistemas mediante el código fuente.[11][12]​ Go es un lenguaje de programación compilado, concurrente, imperativo, estructurado, orientado a objetos y con recolector de basura que de momento es soportado en diferentes tipos de sistemas UNIX, incluidos Linux, FreeBSD, Mac OS X y Plan 9 (puesto que parte del compilador está basado en un trabajo previo sobre el sistema operativo Inferno). Las arquitecturas soportadas son i386, amd64 y ARM.

Nombre[editar]

El día de la publicación del lenguaje Go, Francis McCabe, desarrollador del lenguaje de programación Go! (anteriormente llamado Go), solicitó que se le cambiase el nombre al lenguaje de Google para evitar confusiones con su lenguaje.[13]​ McCabe creó Go! en el año 2003; sin embargo, aún no ha registrado el nombre.[14]​ Go es un nuevo lenguaje de programación para sistemas lanzado por Google en noviembre de 2009. Aunque empezó a ser desarrollado en septiembre de 2007 por Robert Griesemer, Rob Pike y Ken Thompson.

Características[editar]

  • Go es un proyecto opensource.[15]
  • Go usa una sintaxis similar a C.[16]
  • Go usa tipado estático (statically typed ).
  • Go es un lenguaje compilado, al igual que C y C++.
  • Provee de un recolector de basura , reflexión y algunas otras capacidades de lenguajes de alto nivel.
  • El binario de Go tiene la característica de compilación cruzada de manera nativa.
  • Go admite el paradigma de programación orientada a objetos, pero a diferencia de otros lenguajes de programación no dispone de herencia de tipos y tampoco de palabras clave que denoten claramente que soporta este paradigma.
  • En Go, la definición de un tipo ("clase") se realiza por medio de declaraciones separadas (interfaces, structs, embedded values).
  • Go permite el uso de delegación (a través de embedded values) y polimorfismo (por medio de interfaces).
  • Go utiliza la concurrencia a través de las gorutinas.
  • Go esta orientado a aprovechar sistemas con múltiples procesadores y procesamiento en red.[17]
  • Go admite la tipificación dinámica de datos también conocida como duck Typing.[18][19]
  • Un struct puede implementar una interfaz de forma automática.[20]

Excepciones[editar]

Go no utiliza excepciones.[21]​ Los creadores del lenguaje han dado varios motivos para que esto sea así. La principal es que añadir una capa de excepciones agrega una complejidad innecesaria al lenguaje y al entorno de ejecución. Por definición las excepciones deberían ser excepcionales pero al final se acaban usando como controladores del flujo de la aplicación y dejan de tener la finalidad de excepcionalidad. Según los creadores, las excepciones tienen que ser realmente excepcionales y el uso que se le da mayoritariamente no justifica su existencia.

Diferencias principales con C[editar]

Aunque su sintaxis es similar, Go difiere mucho de C. Véanse algunos ejemplos.

Declaraciones al revés[editar]

En Go las declaraciones se realizan al revés desde la perspectiva de C (o C++ o Java). La idea principal en C es que se declara una variable como una expresión que denota su tipo. Según los creadores, aunque la idea detrás de la declaración de tipos en C es buena, los tipos y las expresiones gramaticales no se mezclan demasiado bien y el resultado puede ser confuso. Go sin embargo, separa la expresión y la sintaxis de tipo, lo cual simplifica las cosas.

Punto y coma[editar]

En Go el uso del carácter punto y coma “;“ al final de una instrucción es opcional.

Aritmética de punteros[editar]

Go no tiene aritmética de punteros. Según los creadores, la razón es la seguridad. Sin aritmética de punteros es posible crear un lenguaje en el que no se puede obtener una dirección ilegal que sea usada de forma incorrecta. La falta de aritmética de punteros simplifica la implementación del recolector de basura. Además, optimizando el compilador y con el hardware actual, un bucle que utiliza los índices de un array puede ser tan eficaz como un bucle que utiliza aritmética de punteros.

++ y --[editar]

En Go, el uso de ++ y -- para incrementar y decrementar el valor de una variable es una sentencia y no una expresión. Además, solo puede utilizarse en su versión sufija pues según los autores, la versión prefija pierde todo su sentido en la ausencia de aritmética de punteros.

Programación orientada a objetos[editar]

Para algunos autores, la herencia o las clases no son conceptos esenciales para el paradigma de POO, sino más bien un medio de implementación. Existen desde hace tiempo lenguajes orientados a objetos que no admiten clases, sino que se basan en prototipos, como Javascript o Self. Según declaraciones de Alan Kay, creador de Smalltalk, lo esencial del paradigma es el paso de mensajes.[22]

Go tiene tipos y métodos, y permite un estilo de programación orientado a objetos que reemplaza el uso de clases por estructuras las cuales admiten construir jerarquías, es decir, no soporta el uso herencia y favorece en su lugar el patrón de composición. En Go, el concepto de “interfaz“ es similar al usado en Java: cualquier objeto (value) que cumpla el contrato especificado por una interfaz (sin necesidad de una declaración explícita) obtiene ese tipo. También existen formas de embeber estructuras dentro de otras estructuras para obtener algo análogo a las subclases. Los métodos de Go son más generales que los de C++ o Java, y se incluyen en las estructuras declarando funciones asociadas a estas. Pueden ser definidos para cualquier tipo de datos; no solo para los registros. Por su parte las interfaces de Go a diferencia de lenguajes como Java, son de tipo implícito, es decir que se considera que la interfaz ha sido implementada cuando una estructura implementa sus métodos aun cuando esto no se especifique.

Ejemplos[editar]

El clásico programa Hola mundo en Go es similar a como se haría en C++. Con este típico ejemplo podemos apreciar que en cuanto a sintaxis son muy similares:

package main

import "fmt"

func main() {
  fmt.Println("Hola, mundo.")
}

La notación de los comentarios es exactamente la misma que la de C++

/* ...
   ...
   ... */

// ...

Referencias[editar]

  1. «First-Class Functions in Go». Consultado el November 14, 2018. «Go supports ... a functional programming style in a strongly typed language.» 
  2. «Is Go an object-oriented language?». Consultado el April 13, 2019. «Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy.» 
  3. «Go: code that grows with grace». Consultado el June 24, 2018. «Go is Object Oriented, but not in the usual way.» 
  4. https://golang.org/doc/devel/release.html
  5. «lang/go: go-1.4 – Go programming language». OpenBSD ports. December 23, 2014. Consultado el January 19, 2015. 
  6. «Go Porting Efforts». Go Language Resources. cat-v. January 12, 2010. Consultado el January 18, 2010. 
  7. «Text file LICENSE». The Go Programming Language. Consultado el October 5, 2012. 
  8. «Additional IP Rights Grant». The Go Programming Language. Consultado el October 5, 2012. 
  9. Kincaid, Jason (November 10, 2009). «Google's Go: A New Programming Language That's Python Meets C++». TechCrunch. Consultado el January 18, 2010. 
  10. «Language Design FAQ». golang.org. January 16, 2010. Consultado el February 27, 2010. 
  11. Guía de instalación (inglés)
  12. Guía de instalación (español)
  13. Francis McCabe (10 de noviembre de 2009). «I have already used the name for *MY* programming language» (en inglés). Consultado el 13 de noviembre de 2009. 
  14. Thomas Claburn (11 de noviembre de 2009). InformationWeek, ed. «Google 'Go' Name Brings Accusations Of 'Evil'» (en inglés). Consultado el 13 de noviembre de 2009. 
  15. «The Go Programming Language». golang.org. Consultado el 4 de diciembre de 2020. 
  16. Metz, Cade (5 de mayo de 2011). «Google Go boldly goes where no code has gone before». The Register. 
  17. «Documentation - The Go Programming Language». golang.org. Consultado el 4 de diciembre de 2020. 
  18. Ryer, Mat (3 de junio de 2016). «Duck typing in Go». Medium (en inglés). Consultado el 4 de diciembre de 2020. 
  19. «Is Go Duck-Typed?». Bionic | FullStory. 4 de marzo de 2020. Consultado el 4 de diciembre de 2020. 
  20. Go by Example: Structs
  21. «Error handling and Go - The Go Blog». blog.golang.org. Consultado el 4 de diciembre de 2020. 
  22. Alan Kay (10 de octubre de 1998). «prototypes vs classes was: Re: Sun's HotSpot». Lista de distribución de Squeak (en inglés). squeakfoundation.org. Consultado el 21 de noviembre de 2015. 

Enlaces externos[editar]