Go
|
---|
![](//upload.wikimedia.org/wikipedia/commons/thumb/0/05/Go_Logo_Blue.svg/320px-Go_Logo_Blue.svg.png) |
Desarrollador(es)
|
---|
Google
https://golang.org
y
https://go.dev
|
Informacion general
|
---|
Extensiones comunes
|
.go
|
---|
Paradigma
|
compilado
concurrente
,
imperativo
,
estructurado
[
1
]
[
2
]
[
3
]
|
---|
Aparecio en
|
2009
|
---|
Disenado por
|
Robert Griesemer
,
Rob Pike
y
Ken Thompson
|
---|
Ultima version estable
|
1.22.1
[
4
]
(05 de marzo de 2024 (3 meses y 8 dias))
|
---|
Sistema de tipos
|
fuerte, estatico
|
---|
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 programacion
concurrente
y
compilado
con
tipado estatico
inspirado en la sintaxis de
C
, pero con
seguridad de memoria
y
recoleccion de basura
. Ha sido desarrollado por
Google
[
9
]
y sus disenadores iniciales fueron
Robert Griesemer
,
Rob Pike
y
Ken Thompson
.
[
10
]
Actualmente esta disponible en formato binario para los
sistemas operativos
Windows
,
GNU/Linux
,
FreeBSD
y
Mac OS X
, pudiendo tambien ser instalado en estos y en otros sistemas mediante el codigo fuente.
[
11
]
[
12
]
Go es un
lenguaje de programacion compilado
,
concurrente
,
imperativo
,
estructurado
y
orientado a objetos
que de momento esta disponible para diferentes tipos de sistemas
Unix-like
, incluidos
Linux
,
FreeBSD
,
Mac OS X
y
Plan 9
(puesto que parte del compilador esta basado en un trabajo previo sobre el sistema operativo
Inferno
). Las arquitecturas soportadas son
i386
,
amd64
y
ARM
.
Nombrado
[
editar
]
El dia de la publicacion del lenguaje Go, Francis McCabe, desarrollador del lenguaje de programacion Go! (anteriormente llamado Go), solicito que se le cambiase el nombre al lenguaje de
Google
para evitar confusiones con su lenguaje.
[
13
]
McCabe creo Go! en el ano 2003; sin embargo, aun no ha registrado el nombre.
[
14
]
Go es un nuevo lenguaje de programacion para sistemas lanzado por Google en noviembre de 2009. Aunque empezo a ser desarrollado en septiembre de 2007 por Robert Griesemer, Rob Pike y Ken Thompson.
Caracteristicas
[
editar
]
- Go es un proyecto de
codigo abierto
.
[
15
]
- Go usa una sintaxis similar a C.
[
16
]
- Go usa
tipado estatico
.
- Go es un
lenguaje compilado
, al igual que C y C++.
- Provee un
recolector de basura
, reflexion y algunas otras capacidades de lenguajes de alto nivel.
- Los binarios de Go tienen la caracteristica de
compilacion cruzada
de manera nativa.
- Go admite el paradigma de programacion orientada a objetos, pero a diferencia de otros lenguajes de programacion no dispone de herencia de tipos y tampoco de palabras clave que denoten claramente que soporta este paradigma.
- En Go, la definicion de un tipo ("clase") se realiza por medio de declaraciones separadas (
interfaces, types, structs, embedded values
).
- Go permite el uso de delegacion (a traves de embedded values) y polimorfismo (por medio de interfaces).
- Go utiliza la concurrencia a traves de las gorutinas.
- Go esta orientado a aprovechar sistemas con multiples procesadores y procesamiento en red.
[
17
]
- Go admite la tipificacion dinamica de datos tambien conocida como
Duck typing
.
[
18
]
[
19
]
- Un
struct
puede implementar una interfaz de forma automatica.
[
20
]
Excepciones
[
editar
]
Go no utiliza
excepciones
.
[
21
]
Los creadores del lenguaje han dado varios motivos para que esto sea asi. La principal es que anadir una capa de excepciones agrega una complejidad innecesaria al lenguaje y al entorno de ejecucion. Por definicion las excepciones deberian ser excepcionales, pero al final se acaban usando como controladores del flujo de la aplicacion y dejan de tener la finalidad de excepcionalidad. Segun los creadores, las excepciones tienen que ser realmente excepcionales y el uso que se le da mayoritariamente no justifica su existencia.
Ademas, resulta en flujos con saltos no obvios. Por ejemplo, una excepcion no controlada en una funcion, que se esperaba no pudiese lanzarla, lleva la ejecucion hasta el primer catch que se encuentre. Eso puede dificultar la depuracion.
Otros lenguajes modernos como
Rust
tambien han prescindido de las excepciones por las mismas razones.
Diferencias principales con C
[
editar
]
Aunque su sintaxis es similar, Go difiere mucho de C. Veanse algunos ejemplos.
Declaraciones al reves
[
editar
]
En Go las declaraciones se realizan al reves desde la perspectiva de C (o C++ o Java). La idea principal en C es que se declara una variable como una expresion que denota su tipo. Segun los creadores, aunque la idea detras de la declaracion 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 expresion y la sintaxis de tipo, lo cual simplifica las cosas.
Parentesis
[
editar
]
En C es necesario utilizar parentesis al evaluar expresiones dentro de estructuras de control (por ejemplo, en estructuras
if-then-else
y
for-next
). En Go es considerado poco "idiomatico" utilizar parentesis en estructuras de control.
Punto y coma
[
editar
]
En Go el uso del caracter punto y coma “;“ al final de una instruccion es opcional.
Aritmetica de punteros
[
editar
]
Go no tiene aritmetica de punteros. Segun los creadores, la razon es la seguridad. Sin aritmetica de punteros es posible crear un lenguaje en el que no se puede obtener una direccion ilegal que sea usada de forma incorrecta. La falta de aritmetica de punteros simplifica la implementacion del recolector de basura. Ademas, optimizando el compilador y con el hardware actual, un bucle que utiliza los indices de un array puede ser tan eficaz como un bucle que utiliza aritmetica de punteros.
En Go, el uso de ++ y -- para incrementar y decrementar el valor de una variable es una sentencia y no una expresion. Ademas, solo puede utilizarse en su version sufija pues segun los autores, la version prefija pierde todo su sentido en la ausencia de aritmetica de punteros.
Programacion orientada a objetos
[
editar
]
Para algunos autores, la herencia o las clases no son conceptos esenciales para el
paradigma de POO
, sino mas bien un medio de implementacion. Existen desde hace tiempo lenguajes orientados a objetos que no admiten clases, sino que se basan en prototipos, como
Javascript
o
Self
. Segun declaraciones de
Alan Kay
, creador de
Smalltalk
, lo esencial del paradigma es el
paso de mensajes
.
[
22
]
Go
tiene
tipos y metodos
, y permite un
estilo de programacion orientado a objetos
que reemplaza el uso de clases por estructuras las cuales admiten construir jerarquias, es decir,
no soporta el uso
herencia
y favorece en su lugar el
patron de composicion
. 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 declaracion explicita) obtiene ese tipo. Tambien existen formas de embeber estructuras dentro de otras estructuras para obtener algo analogo a las
subclases
. Los metodos de
Go
son mas 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 implicito, es decir que se considera que la interfaz ha sido implementada cuando una estructura implementa sus metodos aun cuando esto no se especifique.
Aplicaciones
[
editar
]
Algunas aplicaciones notables de codigo abierto escritas en Go son:
[
23
]
- Caddy, un servidor web HTTP/2 de codigo abierto con capacidad HTTPS automatica
- CockroachDB, una base de datos SQL de codigo 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, segmentacion y configuracion.
- Docker
, un conjunto de herramientas para desplegar contenedores Linux
- EdgeX, una plataforma de codigo abierto independiente de los proveedores, alojada por la Fundacion Linux, que proporciona un marco comun para la informatica de borde del IoT industrial
[
24
]
.
- Hugo, un generador de sitios estaticos
- Grafana
, aplicacion web de visualizacion y formato de datos metricos
- InfluxDB, una base de datos de codigo abierto especifica 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 orquestacion de servicios de Canonical, empaquetadores de Ubuntu
Linux
- Sistema de gestion de contenedores
Kubernetes
- Golang Pagoda framework
[
26
]
- lnd, una implementacion de la red
Bitcoin
Lightning
[
27
]
- Mattermost, un sistema de chat en equipo
- NATS Messaging, un sistema de mensajeria de codigo abierto que se basa en los principios de rendimiento, escalabilidad y facilidad de uso.
- OpenShift
, una plataforma de computacion en la nube como servicio de
Red Hat
- Rclone, un programa de linea 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 aplicacion cliente/servidor de sincronizacion de archivos de codigo abierto
- Terraform, una herramienta de aprovisionamiento de infraestructura de nube multiple de codigo abierto de HashiCorp
- TiDB, una base de datos distribuida HTAP de codigo abierto compatible con el protocolo MySQL de PingCAP
- Vitess, una base de datos de codigo abierto, distribuida y compatible con
MySQL
, de
YouTube
, que ahora esta alojada en la Cloud Native Computing Foundation
[
28
]
[
29
]
.
- arctil, herramienta de evaluacion de la seguridad web
[
30
]
Ejemplos
[
editar
]
El clasico programa
Hola mundo
en Go es similar a como se haria en C++. Con este tipico ejemplo podemos apreciar que en cuanto a sintaxis son muy similares:
package
main
import
"fmt"
func
main
()
{
fmt
.
Println
(
"Hola, mundo."
)
}
La notacion de los comentarios es exactamente la misma que la de C++
Un programa para una aplicacion 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
]
- ↑
≪First-Class Functions in Go≫
. Consultado el 14 de noviembre de 2018
. ≪Go supports ... a functional programming style in a strongly typed language.≫
- ↑
≪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.≫
- ↑
≪Go: code that grows with grace≫
. Consultado el 24 de junio de 2018
. ≪Go is Object Oriented, but not in the usual way.≫
- ↑
https://go.dev/doc/devel/release
- ↑
≪lang/go: go-1.4 ? Go programming language≫
.
OpenBSD ports
. 23 de diciembre de 2014
. Consultado el 19 de enero de 2015
.
- ↑
≪Go Porting Efforts≫
.
Go Language Resources
. cat-v. 12 de enero de 2010
. Consultado el 18 de enero de 2010
.
- ↑
≪Text file LICENSE≫
.
The Go Programming Language
. Consultado el 5 de octubre de 2012
.
- ↑
≪Additional IP Rights Grant≫
.
The Go Programming Language
. Consultado el 5 de octubre de 2012
.
- ↑
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
.
- ↑
≪Language Design FAQ≫
.
golang.org
. 16 de enero de 2010
. Consultado el 27 de febrero de 2010
.
- ↑
Guia de instalacion (ingles)
- ↑
Guia de instalacion (espanol)
- ↑
Francis McCabe (10 de noviembre de 2009).
≪I have already used the name for *MY* programming language≫
(en ingles)
. Consultado el 13 de noviembre de 2009
.
- ↑
Thomas Claburn (11 de noviembre de 2009). InformationWeek, ed.
≪Google 'Go' Name Brings Accusations Of 'Evil
'
≫
(en ingles)
. Archivado desde
el original
el 22 de julio de 2010
. Consultado el 13 de noviembre de 2009
.
- ↑
≪The Go Programming Language≫
.
golang.org
. Consultado el 4 de diciembre de 2020
.
- ↑
Metz, Cade (5 de mayo de 2011).
≪Google Go boldly goes where no code has gone before≫
.
The Register
.
- ↑
≪Documentation - The Go Programming Language≫
.
golang.org
. Consultado el 4 de diciembre de 2020
.
- ↑
Ryer, Mat (3 de junio de 2016).
≪Duck typing in Go≫
.
Medium
(en ingles)
. Consultado el 4 de diciembre de 2020
.
- ↑
≪Is Go Duck-Typed?≫
.
Bionic | FullStory
. 4 de marzo de 2020
. Consultado el 4 de diciembre de 2020
.
- ↑
Go by Example: Structs
- ↑
≪Error handling and Go - The Go Blog≫
.
blog.golang.org
. Consultado el 4 de diciembre de 2020
.
- ↑
Alan Kay (10 de octubre de 1998).
≪prototypes vs classes was: Re: Sun's HotSpot≫
.
Lista de distribucion de
Squeak
(en ingles)
. squeakfoundation.org
. Consultado el 21 de noviembre de 2015
.
- ↑
avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software
, consultado el 10 de enero de 2018
.
- ↑
≪EdgeX Foundry Project≫
.
GitHub
(en ingles)
. Consultado el 6 de febrero de 2021
.
- ↑
≪ipfs/go-ipfs≫
.
GitHub
(en ingles)
. Consultado el 1 de junio de 2018
.
- ↑
≪Golang Pagoda framework≫
.
Qualified.One
. 29 de noviembre de 2022.
- ↑
≪lightningnetwork/lnd≫
,
GitHub
, consultado el 29 de abril de 2020
.
- ↑
≪CNCF to host Vitess≫
.
Cloud Native Computing Foundation
. 5 de febrero de 2018.
- ↑
≪Cloud Native Computing Foundation Announces Vitess Graduation≫
.
Cloud Native Computing Foundation
. 5 de noviembre de 2019.
- ↑
≪arctil≫
.
arctil.com
.
Enlaces externos
[
editar
]