Go es un lenguaje de programación de alto nivel y propósito general , con tipado estático y compilado . Se caracteriza por la simplicidad de su sintaxis y la eficiencia del desarrollo que permite gracias a la inclusión de una amplia biblioteca estándar que satisface muchas necesidades de proyectos comunes. [ 13 ] Fue diseñado en Google [ 14 ] en 2007 por Robert Griesemer , Rob Pike y Ken Thompson , y anunciado públicamente en noviembre de 2009. [ 4 ] Es sintácticamente similar a C , pero también cuenta con recolección de basura , tipado estructural [ 8 ] y concurrencia al estilo CSP . [ 15 ] A menudo se le denomina Golang para evitar ambigüedades y debido a su antiguo nombre de dominio, sin embargo, su nombre correcto es Go. [ 16 ]golang.org
Existen dos implementaciones principales:
- La cadena de herramientas del compilador original, autoalojada [ 17 ] , desarrollada inicialmente dentro de Google; [ 18 ]
- Un frontend escrito en C++ , llamado gofrontend, [ 19 ] originalmente un frontend de GCC , que proporciona gccgo, un compilador de Go basado en GCC; [ 20 ] posteriormente se extendió para admitir también LLVM , proporcionando un compilador de Go basado en LLVM llamado gollvm. [ 21 ]
Un compilador de código fuente a código fuente de terceros , GopherJS, [ 22 ] transpila Go a JavaScript para el desarrollo web front-end .
Historia
Go fue diseñado en Google en 2007 para mejorar la productividad de la programación en una era de máquinas multinúcleo , en red y grandes bases de código . [ 23 ] Los diseñadores querían abordar las críticas a otros lenguajes en uso en Google, pero mantener sus características útiles: [ 24 ]
- Tipado estático y eficiencia en tiempo de ejecución (como en C )
- Legibilidad y usabilidad (como Python ) [ 25 ]
- Redes de alto rendimiento y multiprocesamiento
Sus diseñadores fueron motivados principalmente por su aversión compartida a C++ . [ 26 ] [ 27 ] [ 28 ]
Go se anunció públicamente en noviembre de 2009, [ 29 ] y la versión 1.0 se lanzó en marzo de 2012. [ 30 ] [ 31 ] Go se utiliza ampliamente en producción en Google [ 32 ] y en muchas otras organizaciones y proyectos de código abierto.
En retrospectiva, los autores de Go consideraron que Go tuvo éxito debido al trabajo de ingeniería general en torno al lenguaje, incluido el soporte en tiempo de ejecución para la función de concurrencia del lenguaje.
Aunque el diseño de la mayoría de los lenguajes se centra en innovaciones en sintaxis, semántica o tipado, Go se enfoca en el proceso de desarrollo de software en sí. ... La principal propiedad inusual del lenguaje —la concurrencia— abordó problemas que surgieron con la proliferación de CPU multinúcleo en la década de 2010. Pero más significativo fue el trabajo inicial que estableció los fundamentos para el empaquetado, las dependencias, la compilación, las pruebas, el despliegue y otras tareas cotidianas del mundo del desarrollo de software, aspectos que no suelen ser prioritarios en el diseño de lenguajes. [ 33 ]
Imagen de marca y estilo

La mascota de la ardilla terrestre se introdujo en 2009 para el lanzamiento de código abierto del lenguaje. Renée French , quien había diseñado la mascota del conejo para Plan 9 , adaptó la ardilla terrestre de un diseño anterior de camiseta de WFMU . [ 34 ]
En noviembre de 2016, los diseñadores tipográficos Charles Bigelow y Kris Holmes lanzaron las fuentes Go y Go Mono específicamente para su uso en el proyecto Go. Go es una sans-serif humanista similar a Lucida Grande , pero con una compatibilidad métrica casi completa (aunque no total) con Helvetica y Arial , y Go Mono es monoespaciada . Ambas fuentes se adhieren al conjunto de caracteres WGL4 y fueron diseñadas para ser legibles con una altura de x grande y formas de letra distintivas . Tanto Go como Go Mono se adhieren al estándar DIN 1450 al tener un cero tachado, minúsculas lcon cola y mayúsculas Icon serifa. [ 35 ] [ 36 ]
En abril de 2018, el diseñador de marca Adam Smith rediseñó el logotipo original. El nuevo logotipo es una letra GO moderna y estilizada que se inclina hacia la derecha con líneas aerodinámicas que la siguen. La mascota, la ardilla terrestre, se mantuvo igual. [ 37 ]
Medicamentos genéricos
La falta de soporte para la programación genérica en las versiones iniciales de Go generó críticas considerables. [ 38 ] Los diseñadores expresaron una apertura a la programación genérica y señalaron que las funciones integradas eran de hecho genéricas en cuanto a tipos, pero se trataban como casos especiales; Pike calificó esto como una debilidad que podría corregirse en algún momento. [ 39 ] El equipo de Google creó al menos un compilador para un dialecto experimental de Go con genéricos, pero no lo publicó. [ 40 ]
En agosto de 2018, los principales colaboradores de Go publicaron diseños preliminares para la programación genérica y el manejo de errores , y solicitaron a los usuarios que enviaran comentarios. [ 41 ] [ 42 ] Sin embargo, la propuesta de manejo de errores finalmente se abandonó. [ 43 ]
En junio de 2020, se publicó un nuevo borrador de documento de diseño [ 44 ] que añadiría la sintaxis necesaria a Go para declarar funciones y tipos genéricos. Se proporcionó una herramienta de traducción de código, go2go , para que los usuarios pudieran probar la nueva sintaxis, junto con una versión habilitada para genéricos del Go Playground en línea. [ 45 ]
Los genéricos finalmente se agregaron a Go en la versión 1.18 el 15 de marzo de 2022. [ 46 ]
Control de versiones
Go 1 garantiza la compatibilidad [ 47 ] para la especificación del lenguaje y las partes principales de la biblioteca estándar. Todas las versiones hasta la versión actual Go 1.26 [ 48 ] han mantenido esta promesa.
Go utiliza un go1.[major].[patch]formato de versionado, como go1.26.0y cada versión principal de Go es compatible hasta que haya dos versiones principales más recientes. A diferencia de la mayoría del software, Go llama al segundo número de una versión la versión principal, es decir, en go1.26.0es 26la versión principal. [ 49 ] Esto se debe a que Go planea no llegar nunca a la versión 2.0, priorizando la compatibilidad con versiones anteriores sobre posibles cambios incompatibles. [ 50 ]
Diseño
Go está influenciado por C (especialmente por el dialecto Plan 9 [ 51 ] ), pero con énfasis en una mayor simplicidad y seguridad. Consta de:
- Una sintaxis y un entorno que adoptan patrones más comunes en lenguajes dinámicos : [ 52 ]
- Declaración e inicialización de variables concisas opcionales mediante inferencia de tipo ( en lugar de o )
x:=0varxint=0;varx=0; - Compilación rápida [ 53 ]
- Gestión remota de paquetes (
go get) [ 54 ] y documentación de paquetes en línea [ 55 ]
- Declaración e inicialización de variables concisas opcionales mediante inferencia de tipo ( en lugar de o )
- Enfoques distintivos para problemas particulares:
- Primitivas de concurrencia integradas: procesos ligeros (goroutines), canales y la
selectinstrucción - Un sistema de interfaz en lugar de herencia virtual , e incrustación de tipos en lugar de herencia no virtual.
- Un conjunto de herramientas que, por defecto, produce binarios nativos enlazados estáticamente sin dependencias externas de Go.
- Primitivas de concurrencia integradas: procesos ligeros (goroutines), canales y la
- Un deseo de mantener la especificación del lenguaje lo suficientemente simple como para que un programador la recuerde, [ 56 ] en parte omitiendo características que son comunes en lenguajes similares .
- 25 palabras reservadas
Sintaxis
La sintaxis de Go incluye cambios respecto a C, con el objetivo de mantener el código conciso y legible. Se introdujo un operador combinado de declaración/inicialización que permite al programador escribir `or` , sin especificar los tipos de variables utilizadas. Esto contrasta con ` and` de C (aunque desde C23 se admite la inferencia de tipos mediante ` , como en C++ ). Go también elimina la necesidad de usar paréntesis en las condiciones de las sentencias.i:=3s:="Hello, world!"inti=3;char*s="Hello, world!";autoif
Los puntos y coma siguen finalizando las sentencias; [ a ] pero son implícitos cuando se produce el final de una línea. [ b ]
Los métodos pueden devolver múltiples valores, y devolver un par es la forma convencional en que un método indica un error a quien lo llama en Go. [ c ] Go agrega sintaxis literales para inicializar parámetros de struct por nombre y para inicializar mapas y slices . Como alternativa al bucle de tres instrucciones de C, las expresiones de Go permiten una iteración concisa sobre arreglos, slices, cadenas, mapas y canales. [ 59 ]result,errforrange
Palabras clave
Go contiene las siguientes 25 palabras clave: [ 60 ]
breakcasechanconstcontinuedefaultdeferelsefallthroughforfuncgogotoifimportinterfacemappackagerangereturnselectstructswitchtypevar
Tipos
Go tiene varios tipos integrados, incluidos los numéricos ( byte, int64, float32, etc.), booleanos y cadenas de bytes ( string). Las cadenas son inmutables; los operadores integrados y las palabras clave (en lugar de funciones) proporcionan concatenación, comparación y codificación/decodificación UTF-8 . [ 61 ] Los tipos de registro se pueden definir con la structpalabra clave. [ 62 ]
Go contiene las siguientes primitivas: [ 63 ]
boolint8uint8int16uint16int32uint32int64uint64intuintuintptrfloat32float64complex64complex128string
Tenga en cuenta que bytees un alias de uint8y runees un alias de int32.
Para cada tipo Ty cada constante entera no negativa n, existe un tipo de arreglo denotado [n]T; los arreglos de diferentes longitudes son, por lo tanto, de diferentes tipos. Los arreglos dinámicos están disponibles como "segmentos", denotados []Tpara algún tipo T(compárese con otros lenguajes como C/C++ y Java , donde en cambio los arreglos se denotan T[]). Estos tienen una longitud y una capacidad que especifican cuándo se necesita asignar nueva memoria para expandir el arreglo. Varios segmentos pueden compartir su memoria subyacente. [ 39 ] [ 64 ] [ 65 ]
Los punteros están disponibles para todos los tipos, y el puntero alTtipo se denota*T(similar a Rust ; compárese con otros lenguajes como C/C++ y C# , donde los punteros se denotanT*). La toma de direcciones y la indirección utilizan los&y*, como en C, o se producen implícitamente a través de la llamada al método o la sintaxis de acceso a atributos. [ 66 ] [ 67 ] No hay aritmética de punteros, [ d ] excepto a través delunsafe.Pointertipo especial en la biblioteca estándar. [ 68 ]
Para un par de tipos K, V, el tipo map[K]Ves el mapeo de claves de tipo Ka Vvalores de tipo , que puede considerarse equivalente a Map<K, V>en otros lenguajes. La especificación del lenguaje de programación Go no ofrece garantías de rendimiento ni requisitos de implementación para los tipos de mapeo, aunque generalmente se implementa como una tabla hash (equivalente a HashMap<K, V>en otros lenguajes). Las tablas hash están integradas en el lenguaje, con una sintaxis especial y funciones integradas. chan Tes un canal que permite enviar valores de tipo Tentre procesos Go concurrentes . [ 69 ]
Aparte de su soporte para interfaces , el sistema de tipos de Go es nominal : la typepalabra clave se puede usar para definir un nuevo tipo con nombre , que es distinto de otros tipos con nombre que tienen la misma disposición (en el caso de un struct, los mismos miembros en el mismo orden). Algunas conversiones entre tipos (por ejemplo, entre los distintos tipos enteros) están predefinidas y agregar un nuevo tipo puede definir conversiones adicionales, pero las conversiones entre tipos con nombre siempre deben invocarse explícitamente. [ 70 ] Por ejemplo, la typepalabra clave se puede usar para definir un tipo para direcciones IPv4 , basado en enteros sin signo de 32 bits de la siguiente manera:
tipo ipv4addr uint32Con esta definición de tipo, ipv4addr(x)interpreta el uint32valor xcomo una dirección IP. Simplemente asignar xa una variable de tipo ipv4addres un error de tipo. [ 71 ]
Las expresiones constantes pueden ser tipadas o "sin tipo"; se les asigna un tipo cuando se les asigna a una variable tipada si el valor que representan pasa una comprobación en tiempo de compilación. [ 72 ]
Los tipos de función se indican mediante lafuncpalabra clave; toman cero o más parámetros y devuelven cero o más valores, todos ellos tipados. Los parámetros y los valores de retorno determinan el tipo de función; por lo tanto,func(string, int32) (int, error)es el tipo de funciones que toman unstringy un entero con signo de 32 bits, y devuelven un entero con signo (de ancho predeterminado) y un valor del tipo de interfaz integradoerror. [ 73 ]
Cada tipo con nombre tiene un conjunto de métodos asociado. El ejemplo de dirección IP anterior se puede ampliar con un método para comprobar si su valor es un estándar conocido:
// ZeroBroadcast informa si addr es 255.255.255.255. func ( addr ipv4addr ) ZeroBroadcast () bool { return addr == 0xFFFFFFFF }Debido a la tipificación nominal, esta definición de método agrega un método a ipv4addr, pero no a uint32. Si bien los métodos tienen una definición y sintaxis de llamada especiales, no existe un tipo de método distinto. [ 74 ]
Sistema de interfaz
Go proporciona dos características que reemplazan la herencia de clases .
La primera es la incrustación , que puede considerarse una forma automatizada de composición . [ 75 ]
El segundo son sus interfaces , que proporcionan polimorfismo en tiempo de ejecución . [ 76 ] : 266 Las interfaces son una clase de tipos y proporcionan una forma limitada de tipado estructural en el sistema de tipos nominal de Go. Un objeto que es de un tipo de interfaz también es de otro tipo, al igual que los objetos de C++ que son simultáneamente de una clase base y derivada. El diseño de las interfaces de Go se inspiró en protocolos del lenguaje de programación Smalltalk. [ 77 ] Varias fuentes utilizan el término tipado pato al describir las interfaces de Go. [ 78 ] [ 79 ] Aunque el término tipado pato no está definido con precisión y, por lo tanto, no es incorrecto, generalmente implica que la conformidad de tipos no se verifica estáticamente. Debido a que la conformidad con una interfaz de Go es verificada estáticamente por el compilador de Go (excepto cuando se realiza una aserción de tipo), los autores de Go prefieren el término tipado estructural . [ 80 ]
La definición de un tipo de interfaz enumera los métodos requeridos por nombre y tipo. Cualquier objeto de tipo T para el cual existan funciones que coincidan con todos los métodos requeridos del tipo de interfaz I es también un objeto de tipo I. La definición del tipo T no necesita (ni puede) identificar el tipo I. Por ejemplo, si Shape, Square, y Circlese definen como
importar "matemáticas"tipo Shape interface { Área () float64 }// Nota: no hay declaración "implements" type Square struct { side float64 }func ( sq Cuadrado ) Área () float64 { return sq . lado * sq . lado }// No hay declaración "implements" aquí tampoco type Circle struct { radius float64 }func ( c Circle ) Area () float64 { return math . Pi * math . Pow ( c . radius , 2 ) }Entonces, tanto a Squarecomo a Circleson implícitamente a Shapey pueden asignarse a una Shapevariable de tipo . [ 76 ] : 263–268 En lenguaje formal, el sistema de interfaces de Go proporciona tipado estructural en lugar de nominal . Las interfaces pueden incrustar otras interfaces con el efecto de crear una interfaz combinada que es satisfecha exactamente por los tipos que implementan la interfaz incrustada y cualquier método que agregue la interfaz recién definida. [ 76 ] : 270
La biblioteca estándar de Go utiliza interfaces para proporcionar genericidad en varios lugares, incluido el sistema de entrada/salida que se basa en los conceptos de Readery Writer. [ 76 ] : 282–283
Además de llamar a métodos a través de interfaces, Go permite convertir valores de interfaz a otros tipos con una verificación de tipo en tiempo de ejecución. Las construcciones del lenguaje para hacerlo son la aserción de tipo , [ 81 ] que verifica contra un único tipo potencial:
var shp Shape = Square { 5 } square , ok := shp .( Square ) // Afirma que shp es de tipo Square, debería funcionar if ok { fmt . Printf ( "%#v\n" , square ) } else { fmt . Println ( "No se puede imprimir la forma como Square" ) }y el interruptor de tipo , [ 82 ] que comprueba varios tipos:
func ( sq Cuadrado ) Diagonal () float64 { return sq . lado * math . Sqrt2 } func ( c Círculo ) Diámetro () float64 { return 2 * c . radio }func LongestContainedLine ( shp Shape ) float64 { switch v := shp .( type ) { case Square : return v.Diagonal ( ) // O, con aserción de tipo, shp.(Square).Diagonal() case Circle : return v.Diameter ( ) // O , con aserción de tipo, shp.(Circle).Diameter() default : return 0 // En la práctica, esto debería manejarse con errores } }La interfaz vacía es un caso base importante porque puede referirse a un elemento de cualquier tipo concreto. Es similar a la clase en Java o C# o en C o en C++ y Rust y es satisfecha por cualquier tipo, incluidos los tipos integrados como . [ 76 ] : 284 El código que usa la interfaz vacía no puede simplemente llamar a métodos (u operadores integrados) en el objeto al que se refiere, pero puede almacenar el valor, intentar convertirlo a un tipo más útil a través de una aserción de tipo o un cambio de tipo, o inspeccionarlo con el paquete de Go. [ 83 ] Debido a que puede referirse a cualquier valor, es una forma limitada de escapar de las restricciones del tipado estático, como en C pero con comprobaciones de tipo adicionales en tiempo de ejecución.interface{}Objectvoid*Anyintinterface{}reflectinterface{}void*
Este tipo se puede utilizar para modelar datos estructurados de cualquier esquema arbitrario en Go, como datos JSON o YAML , representándolos como una interfaz (mapa de cadena a vacía). Esto describe recursivamente los datos en forma de diccionario con claves de cadena y valores de cualquier tipo. [ 84 ]interface{}map[string]interface{}
Los valores de interfaz se implementan utilizando un puntero a datos y un segundo puntero a información de tipo en tiempo de ejecución. [ 85 ] Al igual que otros tipos implementados mediante punteros en Go, los valores de interfaz son nilsi no están inicializados. [ 86 ]
Código genérico que utiliza tipos parametrizados
Desde la versión 1.18, Go admite código genérico mediante tipos parametrizados. [ 87 ]
Ahora las funciones y los tipos pueden ser genéricos mediante parámetros de tipo. Estos parámetros se especifican entre corchetes, justo después del nombre de la función o del tipo. [ 88 ] El compilador transforma la función o el tipo genérico en no genérico sustituyendo los parámetros de tipo proporcionados, ya sea explícitamente por el usuario o mediante inferencia de tipo por parte del compilador. [ 89 ] Este proceso de transformación se denomina instanciación de tipo. [ 90 ]
Ahora las interfaces pueden definir un conjunto de tipos (conocido como conjunto de tipos) usando |el operador (Unión), así como un conjunto de métodos. Estos cambios se hicieron para admitir restricciones de tipo en el código genérico. Para una función o tipo genérico, una restricción puede pensarse como el tipo del argumento de tipo: un metatipo. Esta nueva ~Tsintaxis será el primer uso de ~como token en Go. ~Tsignifica el conjunto de todos los tipos cuyo tipo subyacente es T. [ 91 ]
tipo Number interface { ~ int | ~ float64 | ~ float32 | ~ int32 | ~ int64 }func Add [ T Number ]( nums ... T ) T { var sum T for _ , v := range nums { sum += v } return sum }func main () { add := Add [ int ] // Instanciación de tipo println ( add ( 1 , 2 , 3 , 4 , 5 )) // 15res := Add ( 1.1 , 2.2 , 3.3 , 4.4 , 5.5 ) // Inferencia de tipo println ( res ) // +1.650000e+001 }Tipos enumerados
Go utiliza el iotaidentificador para crear constantes enumeradas. [ 92 ] [ 93 ]
tipo ByteSize intconst ( _ = iota // ignora el primer valor asignándolo a un identificador en blanco; 0 KB ByteSize = 1 << ( 10 * iota ) // 1 << (10 * 1) == 1 << 10 == 1024; en binario 10000000000 MB // 1 << (10 * 2) == 1048576; en binario 1000000000000000000000 GB // 1 << (10 * 3) == 1073741824; en binario 10000000000000000000000000000000 )Sistema de paquetes
En el sistema de paquetes de Go, cada paquete tiene una ruta (por ejemplo, "compress/bzip2"o "golang.org/x/net/html") y un nombre (por ejemplo, bzip2o html). Por defecto, las definiciones de otros paquetes siempre deben ir precedidas del nombre del otro paquete. Sin embargo, el nombre utilizado puede cambiarse del nombre del paquete, y si se importa como _, no se requiere ningún prefijo de paquete. Solo son accesibles los nombres en mayúsculas de otros paquetes: io.Readeres público, pero bzip2.readerno lo es. [ 94 ] El go getcomando puede recuperar paquetes almacenados en un repositorio remoto [ 95 ] y se anima a los desarrolladores a desarrollar paquetes dentro de una ruta base que corresponda a un repositorio de origen (como example.com/user_name/package_name) para reducir la probabilidad de colisión de nombres con futuras adiciones a la biblioteca estándar u otras bibliotecas externas. [ 96 ]
Concurrencia: goroutines y canales
El lenguaje Go cuenta con funcionalidades integradas, así como con soporte de bibliotecas, para escribir programas concurrentes . El entorno de ejecución es asíncrono : la ejecución de un programa que realiza, por ejemplo, una lectura de red, se suspenderá hasta que haya datos disponibles para su procesamiento, lo que permite que otras partes del programa realicen otras tareas. Esta funcionalidad está integrada en el entorno de ejecución y no requiere ningún cambio en el código del programa. El entorno de ejecución de Go también programa automáticamente operaciones concurrentes (goroutines) en múltiples CPU; esto puede lograr paralelismo para un programa bien escrito. [ 97 ]
La principal estructura de concurrencia es la goroutine , un tipo de hilo ligero . [ 98 ] : 280–281 Una llamada a función con el prefijo de la gopalabra clave inicia una función en una nueva goroutine. La especificación del lenguaje no especifica cómo deben implementarse las goroutines, pero las implementaciones actuales multiplexan las goroutines de un proceso Go en un conjunto más pequeño de hilos del sistema operativo , de forma similar a la planificación realizada en la implementación del entorno de ejecución del compilador Glasgow Haskell (GHC) de Erlang y Haskell . [ 99 ] : 10
Aunque existe un paquete de biblioteca estándar que incluye la mayoría de las estructuras clásicas de control de concurrencia (bloqueos mutex , etc.), [ 99 ] : 151–152 los programas concurrentes idiomáticos prefieren los canales , que envían mensajes entre goroutines. [ 100 ] Los búferes opcionales almacenan mensajes en orden FIFO [ 101 ] : 43 y permiten que las goroutines emisoras procedan antes de que se reciban sus mensajes. [ 98 ] : 233
Los canales tienen un tipo, de modo que un canal de un tipo chan Tsolo puede usarse para transferir mensajes de ese tipo T. Se utiliza una sintaxis especial para operar con ellos; <-ches una expresión que hace que la goroutine en ejecución se bloquee hasta que llegue un valor a través del canal ch, mientras que ch <- xenvía el valor x(posiblemente bloqueándose hasta que otra goroutine reciba el valor). La instrucción integrada switchsimilar a selectse puede usar para implementar comunicación sin bloqueo en múltiples canales; vea a continuación un ejemplo. Go tiene un modelo de memoria que describe cómo las goroutines deben usar canales u otras operaciones para compartir datos de forma segura. [ 102 ]
La existencia de canales no distingue por sí sola a Go de los lenguajes concurrentes basados en el modelo de actores, como Erlang, donde los mensajes se dirigen directamente a los actores (que corresponden a las goroutines). En el modelo de actores, los canales son actores en sí mismos; por lo tanto, dirigirse a un canal simplemente significa dirigirse a un actor. El estilo de actores se puede simular en Go manteniendo una correspondencia uno a uno entre goroutines y canales, pero el lenguaje permite que varias goroutines compartan un canal o que una sola goroutine envíe y reciba mensajes en múltiples canales. [ 99 ] : 147
A partir de estas herramientas se pueden construir estructuras concurrentes como grupos de trabajadores , tuberías (en las que, por ejemplo, un archivo se descomprime y analiza mientras se descarga), llamadas en segundo plano con tiempo de espera, llamadas paralelas "en abanico" a un conjunto de servicios y otras. [ 103 ] Los canales también han encontrado usos más allá de la noción habitual de comunicación entre procesos, como servir como una lista segura de concurrencia de búferes reciclados, [ 104 ] implementar corrutinas (que ayudaron a inspirar el nombre goroutine ), [ 105 ] e implementar iteradores . [ 106 ]
Las convenciones estructurales de Go relacionadas con la concurrencia ( canales y entradas de canal alternativas) se derivan del modelo de procesos secuenciales comunicantes de Tony Hoare . A diferencia de lenguajes de programación concurrentes anteriores como Occam o Limbo (un lenguaje en el que trabajó el codiseñador de Go, Rob Pike), [ 107 ] Go no proporciona ninguna noción integrada de concurrencia segura o verificable. [ 108 ] Si bien el modelo de procesos comunicantes es el preferido en Go, no es el único: todas las goroutines en un programa comparten un único espacio de direcciones. Esto significa que los objetos mutables y los punteros pueden ser compartidos entre goroutines; véase § Falta de seguridad de carrera de datos , más adelante.
Idoneidad para la programación paralela
Aunque las características de concurrencia de Go no están dirigidas principalmente al procesamiento paralelo , [ 97 ] pueden usarse para programar máquinas multiprocesador de memoria compartida . Se han realizado varios estudios sobre la efectividad de este enfoque. [ 109 ] Uno de estos estudios comparó el tamaño (en líneas de código ) y la velocidad de programas escritos por un programador experimentado no familiarizado con el lenguaje y correcciones a estos programas por parte de un experto en Go (del equipo de desarrollo de Google), haciendo lo mismo para Chapel , Cilk e Intel TBB . El estudio encontró que el no experto tendía a escribir algoritmos de divide y vencerás con una instrucción por recursión, mientras que el experto escribía programas de distribución, trabajo y sincronización usando una goroutine por núcleo de procesador. Los programas del experto generalmente eran más rápidos, pero también más largos. [ 110 ]go
Falta de seguridad en caso de carrera de datos
El enfoque de Go hacia la concurrencia se puede resumir como "no te comuniques compartiendo memoria; comparte memoria comunicándote". [ 111 ] No hay restricciones sobre cómo las goroutines acceden a los datos compartidos, lo que hace posibles las carreras de datos . Específicamente, a menos que un programa se sincronice explícitamente a través de canales u otros medios, las escrituras de una goroutine podrían ser parcial, totalmente o no ser visibles en absoluto para otra, a menudo sin garantías sobre el orden de las escrituras. [ 108 ] Además, las estructuras de datos internas de Go , como los valores de interfaz, los encabezados de slice, las tablas hash y los encabezados de cadena, no son inmunes a las carreras de datos, por lo que la seguridad de tipos y memoria puede ser violada en programas multihilo que modifican instancias compartidas de esos tipos sin sincronización. [ 112 ] [ 113 ] En lugar de soporte del lenguaje, la programación concurrente segura se basa, por lo tanto, en convenciones; Por ejemplo, Chisnall recomienda un modismo llamado "aliases xor mutable", lo que significa que pasar un valor mutable (o puntero) a través de un canal señala una transferencia de propiedad sobre el valor a su receptor. [ 99 ] : 155 La cadena de herramientas gc tiene un detector de carrera de datos opcional que puede verificar el acceso no sincronizado a la memoria compartida durante el tiempo de ejecución desde la versión 1.1, [ 114 ] además, también se incluye de forma predeterminada un detector de carrera de mejor esfuerzo desde la versión 1.6 del tiempo de ejecución gc para el acceso al maptipo de datos. [ 115 ]
Binarios
El enlazador en la cadena de herramientas gc crea binarios enlazados estáticamente por defecto; por lo tanto, todos los binarios de Go incluyen el entorno de ejecución de Go. [ 116 ] [ 117 ]
Omisiones
Go omite deliberadamente ciertas características comunes en otros lenguajes, incluyendo la herencia ( de implementación) , las aserciones , la aritmética de punteros , las conversiones de tipo implícitas , las uniones sin etiquetar y las uniones etiquetadas . Los diseñadores agregaron solo aquellas funcionalidades en las que los tres estuvieron de acuerdo. [ 120 ]
De las características del lenguaje omitidas, los diseñadores argumentan explícitamente en contra de las aserciones y la aritmética de punteros, mientras defienden la elección de omitir la herencia de tipos como un lenguaje más útil, fomentando en cambio el uso de interfaces para lograr el despacho dinámico [ h ] y la composición para reutilizar código. La composición y la delegación , de hecho, se automatizan en gran medida mediante structla incrustación; según los investigadores Schmager et al. , esta característica "tiene muchos de los inconvenientes de la herencia: afecta la interfaz pública de los objetos, no es de grano fino (es decir, no hay control a nivel de método sobre la incrustación), los métodos de los objetos incrustados no se pueden ocultar y es estática", lo que hace que "no sea obvio" si los programadores la usarán en exceso en la medida en que se dice que los programadores en otros lenguajes abusan de la herencia. [ 75 ]
El manejo de excepciones se omitió inicialmente en Go debido a la falta de un "diseño que dé un valor proporcional a la complejidad". [ 121 ] Se propuso un mecanismo similar a una excepción panicque recoverevita la estructura de control habitual [ 122 ] y se publicó en la instantánea del 30 de marzo de 2010. [ 123 ] Los autores de Go recomiendan usarlo para errores irrecuperables, como aquellos que deberían detener un programa completo o una solicitud al servidor, o como un atajo para propagar errores hacia arriba en la pila dentro de un paquete. [ 124 ] [ 125 ] En todos los paquetes, Go incluye un tipo de error canónico, y las devoluciones de múltiples valores que usan este tipo son el modismo estándar. [ 4 ]try-catch
Estilo
Los autores de Go dedicaron un esfuerzo considerable a influir en el estilo de los programas de Go:
- La herramienta estandariza automáticamente la indentación, el espaciado y otros detalles superficiales del código
gofmt. Utiliza tabulaciones para la indentación y espacios en blanco para la alineación. La alineación presupone que el editor utiliza una fuente de ancho fijo. [ 126 ]golintrealiza comprobaciones de estilo adicionales automáticamente, pero ha sido descontinuado y archivado por los mantenedores de Go. [ 127 ] - Las herramientas y bibliotecas distribuidas con Go sugieren enfoques estándar para cosas como la documentación de la API (
godoc), [ 128 ] las pruebas (go test), la compilación (go build), la gestión de paquetes (go get), etc. - Go impone reglas que son recomendaciones en otros lenguajes, por ejemplo, prohíbe las dependencias cíclicas, las variables no utilizadas [ 129 ] o las importaciones [ 130 ] y las conversiones de tipo implícitas.
- La omisión de ciertas características (por ejemplo, atajos de programación funcional como los bloques /
mapal estilo Java ) tiende a fomentar un estilo de programación particular, explícito, concreto e imperativo.tryfinally - El primer día, el equipo de Go publicó una colección de modismos de Go, [ 128 ] y más tarde también recopiló comentarios de revisión de código, [ 131 ] charlas, [ 132 ] y publicaciones oficiales del blog [ 133 ] para enseñar el estilo y la filosofía de codificación de Go.
Herramientas
La distribución principal de Go incluye herramientas para construir , probar y analizar código:
go build, que compila binarios de Go utilizando únicamente la información de los propios archivos fuente, sin archivos makefile separados.go test, para pruebas unitarias y microbenchmarks, así como para fuzzinggo fmt, para formatear códigogo installpara recuperar e instalar paquetes remotosgo vet, un analizador estático que busca posibles errores en el códigogo run, un atajo para construir y ejecutar códigogo doc, para mostrar la documentacióngo generate, una forma estándar de invocar generadores de códigogo mod, para crear un nuevo módulo, agregar dependencias, actualizar dependencias, etc.go tool, para invocar herramientas de desarrollo (añadidas en la versión 1.24 de Go)
También incluye soporte para la creación de perfiles y la depuración , capacidades de fuzzing para detectar errores, instrumentación en tiempo de ejecución (por ejemplo, para rastrear las pausas de la recolección de basura ) y un detector de condiciones de carrera .
Otra herramienta mantenida por el equipo de Go pero que no está incluida en las distribuciones de Go es gopls, un servidor de lenguaje que proporciona características de IDE , como la finalización inteligente de código, a editores compatibles con el Protocolo de servidor de lenguaje . [ 134 ]
Un ecosistema de herramientas de terceros se suma a la distribución estándar, como gocode, que permite el autocompletado de código en muchos editores de texto, goimports, que agrega/elimina automáticamente las importaciones de paquetes según sea necesario, y errcheck, que detecta código que podría ignorar errores involuntariamente.
Ejemplos
Hola Mundo
paquete principalimportar "fmt"func main () { fmt.Println ( " hola mundo " ) }donde "fmt" es el paquete para E/S formateada , similar a <stdio.h> de C o <print> de C++ . [ 135 ]
Concurrencia
El siguiente programa sencillo demuestra las características de concurrencia de Go para implementar un programa asíncrono. Inicia dos hilos ligeros ("goroutines"): uno espera a que el usuario escriba texto, mientras que el otro implementa un temporizador. La instrucción `select` espera a que cualquiera de estas gorutinas envíe un mensaje a la rutina principal y actúa sobre el primer mensaje que llega (ejemplo adaptado del libro de David Chisnall). [ 99 ] : 152
paquete principalimportar ( "fmt" "tiempo" )func readword ( ch chan string ) { fmt.Println ( " Escribe una palabra y pulsa Enter." ) var word string fmt.Scanf ( " % s" , & word ) ch <- word }func timeout ( t chan bool ) { time . Sleep ( 5 * time . Second ) t <- false }func main () { t := make ( chan bool ) go timeout ( t )ch := hacer ( cadena chan ) ir leer palabra ( ch )seleccionar { caso palabra := <- ch : fmt . Println ( "Recibido" , palabra ) caso <- t : fmt . Println ( "Tiempo de espera agotado." ) } }Pruebas
El paquete de pruebas proporciona soporte para pruebas automatizadas de paquetes Go. [ 136 ] Ejemplo de función objetivo:
func ExtractUsername ( email string ) string { at := strings . Index ( email , "@" ) return email [: at ] }Código de prueba (tenga en cuenta que la palabra clave assert no existe en Go; las pruebas se encuentran en <filename>_test.go en el mismo paquete):
importar ( "pruebas" )func TestExtractUsername ( t * testing.T ) { t.Run ( "withoutDot" , func ( t * testing.T ) { username := ExtractUsername ( " r@google.com" ) if username ! = "r" { t.Fatalf ( " Got : %v\ n " , username ) } } )t . Run ( "withDot" , func ( t * testing . T ) { username := ExtractUsername ( "jonh.smith@example.com" ) if username != "jonh.smith" { t . Fatalf ( "Got: %v\n" , username ) } }) }Es posible ejecutar pruebas en paralelo.
Aplicación web
El paquete net/http [ 137 ] proporciona soporte para la creación de aplicaciones web.
Este ejemplo mostraría "¡Hola mundo!" cuando se visite localhost:8080.
paquete principalimport ( "fmt" "log" "net/http" )func helloFunc ( w http . ResponseWriter , r * http . Request ) { fmt . Fprintf ( w , "¡Hola mundo!" ) }func main () { http.HandleFunc ( " / " , helloFunc ) log.Fatal ( http.ListenAndServe ( " : 8080 " , nil ) ) }Aplicaciones
Go ha encontrado una amplia adopción en varios dominios debido a su sólida biblioteca estándar y facilidad de uso. [ 138 ]
Entre las aplicaciones más populares se incluyen:
- Caddy : un servidor web que automatiza el proceso de configuración de HTTPS [ 139 ].
- Docker : una plataforma para la contenerización, que tiene como objetivo simplificar las complejidades del desarrollo y la implementación de software [ 140 ].
- Kubernetes : automatiza el despliegue, el escalado y la gestión de aplicaciones en contenedores [ 141 ].
- CockroachDB : una base de datos SQL distribuida diseñada para la escalabilidad y la consistencia fuerte [ 142 ].
- Hugo : un generador de sitios estáticos que prioriza la velocidad y la flexibilidad, lo que permite a los desarrolladores crear sitios web de manera eficiente [ 143 ].
- TypeScript 7 está escrito en Go.
Recepción
El sistema de interfaz y la omisión deliberada de la herencia fueron elogiados por Michele Simionato, quien comparó estas características con las de Standard ML , afirmando que era "una lástima que ningún lenguaje popular hubiera seguido [esta] ruta en particular". [ 144 ]
Dave Astels de Engine Yard escribió en 2009: [ 145 ]
Aprender a usar Go es extremadamente sencillo. Requiere un número mínimo de conceptos fundamentales y su sintaxis es clara e inequívoca. Go aún se encuentra en fase experimental y todavía necesita pulirse algunos detalles.
Go fue nombrado Lenguaje de Programación del Año por el Índice de la Comunidad de Programación TIOBE en su primer año, 2009, por tener un mayor aumento de popularidad en 12 meses (en solo 2 meses, después de su introducción en noviembre) que cualquier otro lenguaje ese año, y alcanzó el puesto 13 en enero de 2010, [ 146 ] superando lenguajes establecidos como Pascal . Para junio de 2015, su clasificación había caído por debajo del puesto 50 en el índice, ubicándolo por debajo de COBOL y Fortran . [ 147 ] Pero en enero de 2017, su clasificación había subido al puesto 13, lo que indica un crecimiento significativo en popularidad y adopción. Go fue nuevamente galardonado con el premio TIOBE al Lenguaje de Programación del Año en 2016. [ 148 ]
Bruce Eckel ha declarado: [ 149 ]
La complejidad de C++ (a la que se ha añadido aún más en la nueva versión) y su consiguiente impacto en la productividad ya no se justifican. Todos los obstáculos que el programador de C++ tenía que superar para usar un lenguaje compatible con C ya no tienen sentido; son simplemente una pérdida de tiempo y esfuerzo. Go resulta mucho más adecuado para el tipo de problemas que C++ pretendía resolver originalmente.
Una evaluación realizada en 2011 por un ingeniero de Google sobre el lenguaje y su implementación de recolector de basura en comparación con C++ ( GCC ), Java y Scala reveló lo siguiente:
Go ofrece características de lenguaje interesantes que permiten una notación concisa y estandarizada. Los compiladores para este lenguaje aún están en desarrollo, lo que se refleja tanto en el rendimiento como en el tamaño de los archivos binarios.
— R. Hundt [ 150 ]
La evaluación recibió una refutación del equipo de desarrollo de Go. Ian Lance Taylor, quien había mejorado el código Go para el artículo de Hundt, desconocía la intención de publicar su código y afirma que su versión "nunca pretendió ser un ejemplo de Go idiomático o eficiente"; Russ Cox optimizó entonces el código Go, así como el código C++, y logró que el código Go se ejecutara casi tan rápido como la versión C++ y más de un orden de magnitud más rápido que el código del artículo. [ 151 ]
- El valor nulo de Go, combinado con la falta de tipos algebraicos, dificulta el manejo de fallos y casos base . [ 152 ] [ 153 ]
- Go ha sido criticado por centrarse en la simplicidad de implementación en lugar de la corrección y la flexibilidad; por ejemplo, el lenguaje utiliza la semántica de archivos POSIX en todas las plataformas y, por lo tanto, proporciona información incorrecta en plataformas como Windows (que no siguen el estándar mencionado). [ 154 ] [ 155 ]
- Un estudio demostró que es tan fácil crear errores de concurrencia con paso de mensajes como con memoria compartida, a veces incluso más. [ 156 ]
Disputa sobre la denominación
El 10 de noviembre de 2009, día del lanzamiento general del lenguaje, Francis McCabe, desarrollador del lenguaje de programación Go! (nótese el signo de exclamación), solicitó un cambio de nombre del lenguaje de Google para evitar confusiones con su propio lenguaje, en el que había invertido 10 años de desarrollo. [ 157 ] McCabe expresó su preocupación de que "el 'tipo grande' terminara aplastándolo", y esta preocupación resonó entre los más de 120 desarrolladores que comentaron en el hilo oficial de problemas de Google diciendo que deberían cambiar el nombre, y algunos [ 158 ] incluso dijeron que el problema contradecía el lema de Google: No seas malvado . [ 159 ]
El 12 de octubre de 2010, el ticket de incidencia pública presentado fue cerrado por el desarrollador de Google Russ Cox (@rsc) con la etiqueta personalizada "Desafortunado" acompañada del siguiente comentario:
"Existen muchos productos y servicios informáticos llamados Go. En los 11 meses transcurridos desde nuestro lanzamiento, ha habido una confusión mínima entre los dos lenguajes." [ 159 ]
Véase también
Notas
- ↑ Pero "Para permitir que las sentencias complejas ocupen una sola línea, se puede omitir un punto y coma antes de un ) o } de cierre". [ 57 ]
- ↑ "Si el salto de línea aparece después de un token que podría finalizar una instrucción, [el analizador léxico] insertará un punto y coma". [ 58 ]
- ↑ Normalmente, exactamente uno de los valores de resultado y error tiene un valor distinto del valor cero del tipo; a veces ambos, como cuando una lectura o escritura solo se puede completar parcialmente, y a veces ninguno, como cuando una lectura devuelve 0 bytes. Véase Problema de semipredicado: retorno multivalor .
- 1 2 Preguntas frecuentes sobre el lenguaje "¿Por qué no hay aritmética de punteros? Seguridad... nunca se deriva una dirección ilegal que tenga éxito incorrectamente... usar índices de matriz puede ser tan eficiente como... la aritmética de punteros... simplifica la implementación del recolector de basura..." [ 4 ]
- ↑ Preguntas frecuentes sobre el lenguaje "¿Por qué Go no tiene aserciones? ...nuestra experiencia ha sido que los programadores las usan como muleta para evitar pensar en el manejo y la notificación adecuados de errores..." [ 4 ]
- ↑ Preguntas frecuentes sobre el lenguaje "¿Por qué no hay uniones sin etiquetar...? [ellas] violarían las garantías de seguridad de memoria de Go." [ 4 ]
- ↑ Preguntas frecuentes sobre el lenguaje "¿Por qué Go no tiene tipos variantes? ... Los consideramos, pero se superponen de forma confusa con las interfaces... Parte de lo que abordan los tipos variantes ya está cubierto, aunque no de forma tan elegante." [ 4 ] ( Se accedea la etiqueta de un tipo de interfaz [ 118 ] con una aserción de tipo [ 119 ] ).
- ↑ Preguntas "¿Cómo consigo despacho dinámico de métodos?" y "¿Por qué no hay herencia de tipos?" en las preguntas frecuentes del lenguaje. [ 4 ]
Referencias
- ↑ "Codewalk: Funciones de primera clase en Go" .
Go admite funciones de primera clase, funciones de orden superior, tipos de funciones definidos por el usuario, literales de función, cierres y múltiples valores de retorno. Este amplio conjunto de características permite un estilo de programación funcional en un lenguaje fuertemente tipado.
- ↑ "¿Es Go un lenguaje orientado a objetos?" . Consultado el 13 de abril de 2019 .
Aunque Go tiene tipos y métodos y permite un estilo de programación orientado a objetos, no existe una jerarquía de tipos.
- ↑ "Go: código que crece con gracia" . Consultado el 24 de junio de 2018.
Go es orientado a objetos, pero no de la forma habitual
. - 1 2 3 4 5 6 7 8 "Preguntas frecuentes sobre el diseño del lenguaje" . El lenguaje de programación Go . 16 de enero de 2010. Archivado del original el 28 de julio de 2025. Recuperado el 27 de febrero de 2010 .
- 1 2 "Archivo de texto LICENCIA" . El lenguaje de programación Go . Archivado del original el 16 de julio de 2025. Recuperado el 5 de octubre de 2012 .
- ↑ "Versión 1.26.5" . 7 de julio de 2026. Consultado el 8 de julio de 2026 .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go . Archivado del original el 13 de agosto de 2025.
- 1 2 "¿Por qué Go no tiene declaraciones "implements"?" . El lenguaje de programación Go . Archivado del original el 28 de julio de 2025 . Recuperado el 1 de octubre de 2015 .
- ↑ Pike, Rob [@rob_pike] (22 de diciembre de 2014). "Go tiene tipado estructural, no tipado pato. Se comprueba y se requiere la plena satisfacción de la interfaz" ( Tweet ). Archivado del original el 7 de abril de 2022. Recuperado el 13 de marzo de 2016 – vía Twitter .
- ↑ "lang/go: go-1.4" . Puertos de OpenBSD . 23 de diciembre de 2014. Consultado el 19 de enero de 2015 .
- ↑ "Esfuerzos de adaptación de Go" . Recursos del lenguaje Go . cat-v. 12 de enero de 2010. Consultado el 18 de enero de 2010 .
- ↑ "Concesión adicional de derechos de propiedad intelectual" . El lenguaje de programación Go . Archivado del original el 30 de marzo de 2025. Consultado el 5 de octubre de 2012 .
- ↑ "Go Introduction" . www.w3schools.com . Consultado el 23 de noviembre de 2024 .
- ↑ Kincaid, Jason (10 de noviembre de 2009). "Go de Google: un nuevo lenguaje de programación que combina Python y C++" . TechCrunch . Consultado el 18 de enero de 2010 .
- ↑ Metz, Cade (5 de mayo de 2011). "Google Go se aventura audazmente donde ningún código ha llegado antes" . The Register . Archivado del original el 28 de julio de 2025.
- ↑ "¿El lenguaje se llama Go o Golang?" . Consultado el 16 de marzo de 2022. El
lenguaje se llama Go.
- ↑ "Notas de la versión 1.5 de Go" . Consultado el 28 de enero de 2016. El
compilador y el entorno de ejecución ahora están implementados en Go y lenguaje ensamblador, sin C.
- ↑ "El lenguaje de programación Go" . GitHub . Consultado el 1 de noviembre de 2024 .
- ↑ "gofrontend" . GitHub . Consultado el 1 de noviembre de 2024 .
- ↑"gccgo". Retrieved November 1, 2024.
gccgo, the GNU compiler for the Go programming language
- ↑"Gollvm". Retrieved November 1, 2024.
Gollvm is an LLVM-based Go compiler.
- ↑"A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs". GitHub. Archived from the original on December 12, 2023.
- ↑"Go at Google: Language Design in the Service of Software Engineering". Retrieved October 8, 2018.
- ↑Pike, Rob (April 28, 2010). "Another Go at Language Design". Stanford EE Computer Systems Colloquium. Stanford University.Video available.
- ↑"Frequently Asked Questions (FAQ) - The Go Programming Language". The Go Programming Language. Retrieved February 26, 2016.
- ↑Binstock, Andrew (May 18, 2011). "Dr. Dobb's: Interview with Ken Thompson". Dr. Dobb's. Archived from the original on January 5, 2013. Retrieved February 7, 2014.
- ↑Pike, Rob (2012). "Less is exponentially more".
- ↑Griesemer, Robert (2015). "The Evolution of Go".
- ↑Griesemer, Robert; Pike, Rob; Thompson, Ken; Taylor, Ian; Cox, Russ; Kim, Jini; Langley, Adam. "Hey! Ho! Let's Go!". Google Open Source. Retrieved May 17, 2018.
- ↑Shankland, Stephen (March 30, 2012). "Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google". News. CNet. CBS Interactive Inc. Retrieved August 6, 2017.
Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++.
- ↑"Release History". The Go Programming Language.
- ↑"Go FAQ: Is Google using Go internally?". Retrieved March 9, 2013.
- ↑ El lenguaje y entorno de programación Go. Communications of the ACM. https://dl.acm.org/doi/pdf/10.1145/3488716
- ↑ "The Go Gopher - El lenguaje de programación Go" . go.dev . Consultado el 9 de febrero de 2023 .
- ↑ "Go fonts" . Go. 16 de noviembre de 2016. Consultado el 12 de marzo de 2019 .
- ↑ "Go Font TTFs" . GitHub . Consultado el 2 de abril de 2019 .
- ↑ "La nueva marca de Go" . El blog de Go . Consultado el 9 de noviembre de 2018 .
- ↑ Merrick, Alice (9 de marzo de 2021). "Resultados de la encuesta a desarrolladores de Go 2020" . Lenguaje de programación Go . Recuperado el 16 de marzo de 2022 .
- 1 2 Pike, Rob (26 de septiembre de 2013). "Matrices, rebanadas (y cadenas): La mecánica de 'append'" . El blog Go . Consultado el 7 de marzo de 2015 .
- ↑ «E2E: Erik Meijer y Robert Griesemer» . Canal 9 . Microsoft. 7 de mayo de 2012.
- ↑ "Go 2 Draft Designs" . Consultado el 12 de septiembre de 2018 .
- ↑ "El blog de Go: Diseños de Go 2 Draft" . 28 de agosto de 2018.
- ↑ "Propuesta: Una función de comprobación de errores integrada en Go, "try"" . Repositorio Go en GitHub . Consultado el 16 de marzo de 2022 .
- ↑ "Parámetros de tipo — Borrador de diseño" . go.googlesource.com .
- ↑ "Genéricos en Go" . bitfieldconsulting.com . 17 de diciembre de 2021.
- ↑ "¡Go 1.18 ha sido lanzado!" . Lenguaje de programación Go . 15 de marzo de 2022 . Consultado el 16 de marzo de 2022 .
- ↑ "Go 1 y el futuro de los programas Go" . El lenguaje de programación Go .
- ↑ "Notas de la versión 1.26 de Go" . El lenguaje de programación Go .
- ↑ "Historial de versiones" . El lenguaje de programación Go .
- ↑ "Compatibilidad con versiones anteriores, Go 1.21 y Go 2" . El lenguaje de programación Go .
- ↑ "Una guía rápida del ensamblador de Go" . go.dev . Consultado el 31 de diciembre de 2021 .
- ↑ Pike, Rob (10 de noviembre de 2009). "El lenguaje de programación Go" . YouTube . Consultado el 1 de julio de 2011 .
- ↑ Pike, Rob (10 de noviembre de 2009). El lenguaje de programación Go (flv) (Charla técnica). Google. El evento tiene lugar a las 8:53.
- ↑ "Descargar e instalar paquetes y dependencias" .Consulte godoc.org para obtener direcciones y documentación de algunos paquetes.
- ↑ "GoDoc" . godoc.org .
- ↑ Pike, Rob. "The Changelog" (Podcast). Archivado del original el 20 de octubre de 2013. Recuperado el 7 de octubre de 2013 .
- ↑ "Especificación del lenguaje de programación Go, §Punto y coma" . El lenguaje de programación Go .
- ↑ "Go efectivo, §Punto y coma" . El lenguaje de programación Go .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go .
- ↑ "Palabras clave e identificadores en Go" . go101.org . Consultado el 10 de octubre de 2025 .
- ↑ Pike, Rob (23 de octubre de 2013). "Cadenas, bytes, runas y caracteres en Go" .
- ↑ Doxsey, Caleb. "Estructuras e interfaces : una introducción a la programación en Go" . www.golang-book.com . Archivado del original el 31 de diciembre de 2018. Consultado el 15 de octubre de 2018 .
- ↑ "Descripción general del sistema de tipos Go" . go101.org . Consultado el 10 de octubre de 2025 .
- ↑ Gerrand, Andrew. "Go Slices: uso y aspectos internos" .
- ↑ Los autores de Go. "Go efectivo: Slices" .
- ↑ Los autores de Go. "Selectores" .
- ↑ Los autores de Go. "Llamadas" .
- ↑ "Especificación del lenguaje de programación Go, §Paquete inseguro" . El lenguaje de programación Go .
- ↑ "Especificación del lenguaje de programación Go" . go.dev . Consultado el 31 de diciembre de 2021 .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go .
- ↑ "Un recorrido por Go" . go.dev .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go .
- ↑ "Especificación del lenguaje de programación Go" . go.dev . Consultado el 31 de diciembre de 2021 .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go .
- 1 2 Schmager, Frank; Cameron, Nicholas; Noble, James (2010). GoHotDraw: evaluación del lenguaje de programación Go con patrones de diseño . Evaluación y usabilidad de lenguajes y herramientas de programación. ACM.
- 1 2 3 4 5 Balbaert, Ivo (2012). El camino a seguir: una introducción completa al lenguaje de programación Go . iUniverse.
- ↑ "La evolución de Go" . talks.golang.org . Consultado el 13 de marzo de 2016 .
- ↑ Diggins, Christopher (24 de noviembre de 2009). "Duck Typing y el lenguaje de programación Go" . Dr. Dobb's, El mundo del desarrollo de software . Recuperado el 10 de marzo de 2016 .
- ↑ Ryer, Mat (1 de diciembre de 2015). "Tipado dinámico en Go" . Recuperado el 10 de marzo de 2016 .
- ↑ "Preguntas frecuentes (FAQ) - El lenguaje de programación Go" . El lenguaje de programación Go .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go .
- ↑ "reflect package" . pkg.go.dev .
- ↑ "map [ string ] interface{} en Go" . bitfieldconsulting.com . 6 de junio de 2020.
- ↑ "Estructuras de datos Go: Interfaces" . Consultado el 15 de noviembre de 2012 .
- ↑ "Especificación del lenguaje de programación Go" . El lenguaje de programación Go .
- ↑ "Notas de la versión 1.18 de Go: Genéricos" . Lenguaje de programación Go . 15 de marzo de 2022. Consultado el 16 de marzo de 2022 .
- ↑ "Propuesta de parámetros de tipo" . go.googlesource.com . Consultado el 25 de junio de 2023 .
- ↑ "Especificación del lenguaje de programación Go - El lenguaje de programación Go" . go.dev . Consultado el 25 de junio de 2023 .
- ↑ "Una introducción a los genéricos: el lenguaje de programación Go" . go.dev . Consultado el 25 de junio de 2023 .
- ↑ "Propuesta de parámetros de tipo" . go.googlesource.com . Consultado el 25 de junio de 2023 .
- ↑ "Go efectivo" . golang.org . Los autores de Go . Consultado el 13 de mayo de 2014 .
- ↑ "Go Wiki: Iota - El lenguaje de programación Go" . go.dev . Consultado el 15 de mayo de 2025.
El identificador iota de Go se utiliza en las declaraciones const para simplificar las definiciones de números incrementales. Debido a que se puede usar en expresiones, proporciona una generalidad que va más allá de las enumeraciones simples.
- ↑ "Tutorial para el lenguaje de programación Go" . El lenguaje de programación Go . Consultado el 10 de marzo de 2013. En Go ,
la regla sobre la visibilidad de la información es simple: si un nombre (de un tipo, función, método, constante o variable de nivel superior, o de un campo o método de una estructura) está en mayúscula, los usuarios del paquete pueden verlo. De lo contrario, el nombre y, por lo tanto, lo que se nombra, solo es visible dentro del paquete en el que se declara.
- ↑ "go" . El lenguaje de programación Go .
- ↑ "Cómo escribir código Go" . El lenguaje de programación Go .
Los paquetes de la biblioteca estándar tienen rutas de importación cortas como "fmt" y "net/http". Para tus propios paquetes, debes elegir una ruta base que no tenga problemas para entrar en conflicto con futuras adiciones a la biblioteca estándar u otras bibliotecas externas. Si guardas tu código en un repositorio de código fuente, debes usar la raíz de ese repositorio como ruta base. Por ejemplo, si tienes una cuenta Example en example.com/user, esa debería ser tu ruta base.
- 1 2 Pike, Rob (18 de septiembre de 2012). "La concurrencia no es paralelismo" .
- 1 2 Donovan, Alan AA; Kernighan, Brian W. (2016). El lenguaje de programación Go . Serie de informática profesional de Addison-Wesley. Nueva York, Múnich: Addison-Wesley. ISBN 978-0-13-419044-0.
- 1 2 3 4 5 Chisnall, David (2012). The Go Programming Language Phrasebook . Addison-Wesley. ISBN 9780132919005.
- ↑ "Go efectivo" . El lenguaje de programación Go .
- ↑ Summerfield, Mark (2012). Programación en Go: Creación de aplicaciones para el siglo XXI . Addison-Wesley.
- ↑ "El modelo de memoria Go" . Consultado el 10 de abril de 2017 .
- ↑ "Patrones de concurrencia en Go" . El lenguaje de programación Go .
- ↑ Graham-Cumming, John (24 de agosto de 2013). "Reciclaje de búferes de memoria en Go" . El blog de Cloudflare .
- ↑ "tree.go" .
- ↑ Cheslack-Postava, Ewen. "Iteradores en Go" .
- ↑ Kernighan, Brian W. "Un descenso al limbo" .
- 1 2 "El modelo de memoria Go" . Consultado el 5 de enero de 2011 .
- ↑ Tang, Peiyi (2010). Programación paralela multinúcleo en Go (PDF) . Actas de la Primera Conferencia Internacional sobre Computación y Comunicaciones Avanzadas. Archivado del original (PDF) el 9 de septiembre de 2016. Recuperado el 14 de mayo de 2015 .
- ↑ Nanz, Sebastian; West, Scott; Soares Da Silveira, Kaue. Examinando la brecha de expertos en programación paralela (PDF) . Euro-Par 2013. CiteSeerX 10.1.1.368.6137 .
- ↑ ¡ Vamos, autores! "Compartan recuerdos comunicándose" .
- ↑ Cox, Russ . "A las carreras" .
- ↑ Pike, Rob (25 de octubre de 2012). "Go at Google: Language Design in the Service of Software Engineering" . Google, Inc."Hay una advertencia importante: Go no es completamente seguro en cuanto al uso de memoria en presencia de concurrencia."
- ↑ "Presentamos el Go Race Detector" . El blog de Go . Consultado el 26 de junio de 2013 .
- ↑ "Notas de la versión 1.6 de Go - El lenguaje de programación Go" . go.dev . Consultado el 17 de noviembre de 2023 .
- ↑ "Preguntas frecuentes (FAQ) - El lenguaje de programación Go" .
- ↑ "Una historia de un binario de Go gordo" . 21 de septiembre de 2018.
- ↑ "Especificación del lenguaje de programación Go, §Tipos de interfaz" . El lenguaje de programación Go .
- ↑ "Especificación del lenguaje de programación Go, §Aserciones de tipo" . El lenguaje de programación Go .
- ↑ "Todo listo" . informIT (Entrevista). 17 de agosto de 2010. Consultado el 21 de junio de 2018 .
- ↑ "Preguntas frecuentes sobre diseño de lenguaje" . 13 de noviembre de 2009. Archivado del original el 13 de noviembre de 2009.
- ↑ "Propuesta para un mecanismo similar a una excepción" . golang-nuts . 25 de marzo de 2010. Consultado el 25 de marzo de 2010 .
- ↑ "Historial de instantáneas semanales" . El lenguaje de programación Go .
- ↑ "Entra en pánico y recupérate" . Ir a la wiki.
- ↑ "Go efectivo" . El lenguaje de programación Go .
- ↑ "gofmt" . El lenguaje de programación Go . Consultado el 5 de febrero de 2021 .
- ↑ "Archivo público de golang/lint" . github.com . 30 de noviembre de 2022.
- 1 2 "Go efectivo" . El lenguaje de programación Go .
- ↑ "Variables locales no utilizadas" . yourbasic.org . Consultado el 11 de febrero de 2021 .
- ↑ "Importaciones de paquetes no utilizadas" . yourbasic.org . Consultado el 11 de febrero de 2021 .
- ↑ "Comentarios de revisión de código" . GitHub . Consultado el 3 de julio de 2018 .
- ↑ "Charlas" . Consultado el 3 de julio de 2018 .
- ↑ "Los errores son valores" . Consultado el 3 de julio de 2018 .
- ↑ "tools/gopls/README.md en master · golang/tools" . GitHub . Consultado el 17 de noviembre de 2023 .
- ↑ "fmt" . El lenguaje de programación Go . Consultado el 8 de abril de 2019 .
- ↑ "pruebas" . El lenguaje de programación Go . Consultado el 27 de diciembre de 2020 .
- ↑ "http package - net/http - Go Packages" . pkg.go.dev . Consultado el 23 de noviembre de 2024 .
- ↑ Lee, Wei-Meng (24 de noviembre de 2022). "Introducción al lenguaje de programación Go" . Component Developer Magazine . Archivado del original el 5 de junio de 2023. Recuperado el 8 de septiembre de 2023 .
- ↑ Hoffmann, Frank; Neumeyer, Mandy (agosto de 2018). "Simplemente seguro" . Linux Magazine . N.° 213. Archivado del original el 28 de mayo de 2023. Recuperado el 8 de septiembre de 2023 .
- ↑ Lee, Wei-Meng (31 de agosto de 2022). "Introducción a la contenerización con Docker" . Revista CODE . Archivado del original el 30 de mayo de 2023. Consultado el 8 de septiembre de 2023 .
- ↑ Pirker, Alexander (24 de febrero de 2023). "Seguridad de Kubernetes para principiantes" . Revista CODE . Archivado del original el 1 de abril de 2023. Recuperado el 8 de septiembre de 2023 .
- ↑ Taft, Rebecca; Sharif, Irfan; Matei, Andrei; Van Benschoten, Nathan; Lewis, Jordan; Grieger, Tobias; Niemi, Kai; Woods, Andy; Birzin, Anne; Poss, Raphael; Bardea, Paul; Ranade, Amruta; Darnell, Ben; Gruneir, Bram; Jaffray, Justin; Zhang, Lucy; Mattis, Peter (11 de junio de 2020). "CockroachDB: La base de datos SQL geodistribuida resiliente". Actas de la Conferencia Internacional ACM SIGMOD 2020 sobre Gestión de Datos . SIGMOD '20. págs. 1493–1509 . doi : 10.1145/3318464.3386134 . ISBN 978-1-4503-6735-6.
- ↑ Hopkins, Brandon (13 de septiembre de 2022). "Generación de sitios estáticos con Hugo" . Linux Journal . Archivado del original el 8 de abril de 2023. Recuperado el 8 de septiembre de 2023 .
- ↑ Simionato, Michele (15 de noviembre de 2009). "Interfaces vs. Inheritance (o, ¡cuidado con Go!)" . artima . Consultado el 15 de noviembre de 2009 .
- ↑ Astels, Dave (9 de noviembre de 2009). "¡Listos, preparados, ya!" . engineyard. Archivado del original el 19 de octubre de 2018. Recuperado el 9 de noviembre de 2009 .
- ↑ jt (11 de enero de 2010). "Go de Google gana el premio al lenguaje de programación del año" . jaxenter . Consultado el 5 de diciembre de 2012 .
- ↑ "Índice de la comunidad de programación de TIOBE para junio de 2015" . TIOBE Software. Junio de 2015. Consultado el 5 de julio de 2015 .
- ↑ "Índice TIOBE" . TIOBE . Consultado el 15 de julio de 2024 .
- ↑ Eckel, Bruce (27 de agosto de 2011). "Llamando a Go desde Python a través de JSON-RPC" . Recuperado el 29 de agosto de 2011 .
- ↑ Hundt, Robert (2011). Reconocimiento de bucles en C++/Java/Go/Scala (PDF) . Scala Days.
- ↑ Metz, Cade (1 de julio de 2011). "Google Go contraataca con una competencia de C++" . The Register .
- ↑ Yager, Will. "Por qué ir no es bueno" . Recuperado el 4 de noviembre de 2018 .
- ↑ Dobronszki, Janos. "Problemas cotidianos en Go" . Consultado el 4 de noviembre de 2018 .
- ↑ "Quiero bajarme del viaje salvaje del Sr. Golang" . 28 de febrero de 2020. Consultado el 17 de noviembre de 2020 .
- ↑ "propuesta: os: Create/Open/OpenFile() establece FILE_SHARE_DELETE en windows #32088" . GitHub . 16 de mayo de 2019 . Consultado el 17 de noviembre de 2020 .
- ↑ Tu, Tengfei (2019). "Understanding Real-World Concurrency Bugs in Go" (PDF) .
Por ejemplo, alrededor del 58% de los errores de bloqueo son causados por el paso de mensajes. Además de la violación de las reglas de uso de canales de Go (por ejemplo, esperar en un canal al que nadie envía datos o que está cerrado), muchos errores de concurrencia son causados por el uso mixto del paso de mensajes y otras semánticas nuevas y bibliotecas nuevas en Go, que pueden pasar desapercibidas fácilmente pero son difíciles de detectar.
- ↑ Brownlee, John (13 de noviembre de 2009). "Google no buscó en Google 'Go' antes de nombrar su lenguaje de programación".Archivado del original el 8 de diciembre de 2015. Consultado el 26 de mayo de 2016 .
- ↑ Claburn, Thomas (11 de noviembre de 2009). "El nombre 'Go' de Google genera acusaciones de maldad"." . InformationWeek. Archivado del original el 22 de julio de 2010. Consultado el 18 de enero de 2010 .
- 1 2 "Problema 9 - adelante — Ya he usado el nombre para *MI* lenguaje de programación" . Github . Google Inc. Recuperado el 12 de octubre de 2010 .
Lecturas adicionales
- Donovan, Alan; Kernighan, Brian (octubre de 2015). El lenguaje de programación Go (1.ª ed.). Addison-Wesley Professional . pág. 400. ISBN 978-0-13-419044-0.
- Bodner, Jon (marzo de 2021). Aprendiendo Go (1.ª ed.). O'Reilly . pág. 352. ISBN 9781492077213.
Enlaces externos
- Go (lenguaje de programación)
- Inventos estadounidenses
- Familia de lenguajes de programación C
- Lenguajes de programación compilados
- Lenguajes de programación concurrentes
- Software libre multiplataforma
- Software multiplataforma
- Compiladores libres y de código abierto
- Software de Google
- Lenguajes de programación de alto nivel
- Lenguajes de programación procedimental
- Lenguajes de programación
- Lenguajes de programación creados en 2009
- Software que utiliza la licencia BSD.
- Lenguajes de programación de tipado estático
- lenguajes de programación de sistemas