Go (lenguaje de programación)

De Wikipedia, la enciclopedia libre
Go
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.22.1[4](05 de marzo de 2024 (13 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 con tipado estático inspirado en la sintaxis de C, pero con seguridad de memoria y recolección de basura. 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 y orientado a objetos que de momento está disponible para diferentes tipos de sistemas Unix-like, 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.

Nombrado[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 de código abierto.[15]
  • Go usa una sintaxis similar a C.[16]
  • Go usa tipado estático.
  • Go es un lenguaje compilado, al igual que C y C++.
  • Provee un recolector de basura, reflexión y algunas otras capacidades de lenguajes de alto nivel.
  • Los binarios de Go tienen 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, types, 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.

Además, resulta en flujos con saltos no obvios. Por ejemplo, una excepción no controlada en una función, que se esperaba no pudiese lanzarla, lleva la ejecución hasta el primer catch que se encuentre. Eso puede dificultar la depuración.

Otros lenguajes modernos como Rust también han prescindido de las excepciones por las mismas razones.

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.

Paréntesis[editar]

En C es necesario utilizar paréntesis al evaluar expresiones dentro de estructuras de control (por ejemplo, en estructuras if-then-else y for-next). En Go es considerado poco "idiomático" utilizar paréntesis en estructuras de control.

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.

Aplicaciones[editar]

Algunas aplicaciones notables de código abierto escritas en Go son:[23]

  • Caddy, un servidor web HTTP/2 de código abierto con capacidad HTTPS automática
  • CockroachDB, una base de datos SQL de código abierto, con capacidad de supervivencia, fuertemente consistente y escalable
  • Consul, un software para el descubrimiento de servicios basado en DNS y que proporciona almacenamiento distribuido de valores clave, segmentación y configuración.
  • Docker, un conjunto de herramientas para desplegar contenedores Linux
  • EdgeX, una plataforma de código abierto independiente de los proveedores, alojada por la Fundación Linux, que proporciona un marco común para la informática de borde del IoT industrial[24]​.
  • Hugo, un generador de sitios estáticos
  • Grafana, aplicación web de visualización y formato de datos métricos
  • InfluxDB, una base de datos de código abierto específica para manejar datos de series temporales con requisitos de alta disponibilidad y alto rendimiento
  • InterPlanetary File System, un protocolo hipermedia peer-to-peer con direcciones de contenido[25]​.
  • Juju, una herramienta de orquestación de servicios de Canonical, empaquetadores de Ubuntu Linux
  • Sistema de gestión de contenedores Kubernetes
  • Golang Pagoda framework[26]
  • lnd, una implementación de la red Bitcoin Lightning[27]
  • Mattermost, un sistema de chat en equipo
  • NATS Messaging, un sistema de mensajería de código abierto que se basa en los principios de rendimiento, escalabilidad y facilidad de uso.
  • OpenShift, una plataforma de computación en la nube como servicio de Red Hat
  • Rclone, un programa de línea de comandos para gestionar archivos en el almacenamiento en la nube y otros servicios de alta latencia
  • Snappy, un gestor de paquetes para Ubuntu Touch desarrollado por Canonical
  • Syncthing, una aplicación cliente/servidor de sincronización de archivos de código abierto
  • Terraform, una herramienta de aprovisionamiento de infraestructura de nube múltiple de código abierto de HashiCorp
  • TiDB, una base de datos distribuida HTAP de código abierto compatible con el protocolo MySQL de PingCAP
  • Vitess, una base de datos de código abierto, distribuida y compatible con MySQL, de YouTube, que ahora está alojada en la Cloud Native Computing Foundation[28][29]​.
  • arctil, herramienta de evaluación de la seguridad web[30]

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++

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

// ...

Un programa para una aplicación web.

package main

import (
    "fmt"
    "log"
    "net/http"    
)

func holaFunc(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hola mundo!")
}

func main() {
    http.HandleFunc("/", holaFunc)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Referencias[editar]

  1. «First-Class Functions in Go». Consultado el 14 de noviembre de 2018. «Go supports ... a functional programming style in a strongly typed language. » 
  2. «Is Go an object-oriented language?». Consultado el 13 de abril de 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 24 de junio de 2018. «Go is Object Oriented, but not in the usual way. » 
  4. https://go.dev/doc/devel/release
  5. «lang/go: go-1.4 – Go programming language». OpenBSD ports. 23 de diciembre de 2014. Consultado el 19 de enero de 2015. 
  6. «Go Porting Efforts». Go Language Resources. cat-v. 12 de enero de 2010. Consultado el 18 de enero de 2010. 
  7. «Text file LICENSE». The Go Programming Language. Consultado el 5 de octubre de 2012. 
  8. «Additional IP Rights Grant». The Go Programming Language. Consultado el 5 de octubre de 2012. 
  9. Kincaid, Jason (10 de noviembre de 2009). «Google's Go: A New Programming Language That's Python Meets C++». TechCrunch. Consultado el 18 de enero de 2010. 
  10. «Language Design FAQ». golang.org. 16 de enero de 2010. Consultado el 27 de febrero de 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). Archivado desde el original el 22 de julio de 2010. 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. 
  23. avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software, consultado el 10 de enero de 2018 .
  24. «EdgeX Foundry Project». GitHub (en inglés). Consultado el 6 de febrero de 2021. 
  25. «ipfs/go-ipfs». GitHub (en inglés). Consultado el 1 de junio de 2018. 
  26. «Golang Pagoda framework». Qualified.One. 29 de noviembre de 2022. 
  27. «lightningnetwork/lnd», GitHub, consultado el 29 de abril de 2020 .
  28. «CNCF to host Vitess». Cloud Native Computing Foundation. 5 de febrero de 2018. 
  29. «Cloud Native Computing Foundation Announces Vitess Graduation». Cloud Native Computing Foundation. 5 de noviembre de 2019. 
  30. «arctil». arctil.com. 

Enlaces externos[editar]