De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

Go es un lenguaje de programación compilado y tipado estáticamente diseñado en Google [11] por Robert Griesemer , Rob Pike y Ken Thompson . [12] Go es sintácticamente similar a C , pero con seguridad de memoria , recolección de basura , tipificación estructural , [6] y concurrencia al estilo CSP . [13] El idioma a menudo se conoce como Golang debido a su nombre de dominio,golang.org, pero el nombre correcto es Go. [14]

Hay dos implementaciones principales:

  • De Google autoalojamiento [15] compilador cadena de herramientas de orientación múltiples sistemas operativos , y WebAssembly . [dieciséis]
  • gccgo, una interfaz de GCC . [17] [18]

A terceros transpiler GopherJS [19] compila Ir a JavaScript para el desarrollo web front-end .

Historia [ editar ]

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 . [20] Los diseñadores querían abordar las críticas de otros lenguajes en uso en Google , pero mantienen sus características útiles: [21]

  • tipado estático y eficiencia en tiempo de ejecución (como C ),
  • legibilidad y usabilidad (como Python o JavaScript ), [22]
  • multiprocesamiento y redes de alto rendimiento .

Los diseñadores estaban motivados principalmente por su aversión compartida por C ++ . [23] [24] [25]

Go se anunció públicamente en noviembre de 2009, [26] y la versión 1.0 se lanzó en marzo de 2012. [27] [28] Go se usa ampliamente en producción en Google [29] y en muchas otras organizaciones y proyectos de código abierto.

Mascota de Gopher

En noviembre de 2016, los diseñadores tipográficos Charles Bigelow y Kris Holmes lanzaron las fuentes Go y Go Mono específicamente para el proyecto Go. Go es un sans-serif humanista que se parece a Lucida Grande y Go Mono es monoespaciado . Cada una de las fuentes se adhiere al conjunto de caracteres WGL4 y fue diseñada para ser legible con una gran altura xy formas de letras distintas. Tanto Go como Go Mono se adhieren al estándar DIN 1450 al tener un cero cortado, minúsculas lcon cola y mayúsculas Icon serifas. [30] [31]

En abril de 2018, el logotipo original fue reemplazado por un GO estilizado inclinado hacia la derecha con líneas de corriente al final. Sin embargo, la mascota Gopher siguió siendo la misma. [32]

En agosto de 2018, los principales contribuyentes de Go publicaron dos "diseños preliminares" para las nuevas funciones del lenguaje, los genéricos y el manejo de errores , y pidieron a los usuarios de Go que enviaran comentarios sobre ellos. [33] [34] La falta de soporte para la programación genérica y la verbosidad del manejo de errores en Go 1.x habían generado críticas considerables .

Historial de versiones [ editar ]

Go 1 garantiza la compatibilidad [35] para la especificación del lenguaje y las principales partes de la biblioteca estándar. Todas las versiones hasta la versión actual de Go 1.15 [36] han mantenido esta promesa.

Cada versión principal de Go es compatible hasta que haya dos versiones principales más recientes. [37]

Diseño [ editar ]

Go está influenciado por C , pero con énfasis en una mayor simplicidad y seguridad. El idioma consta de:

  • Una sintaxis y un entorno que adoptan patrones más comunes en los lenguajes dinámicos : [43]
    • Declaración e inicialización de variable concisa opcional mediante inferencia de tipo (en x := 0lugar de int x = 0;o var x = 0;).
    • Recopilación rápida. [44]
    • Gestión remota de paquetes ( go get) [45] y documentación de paquetes en línea. [46]
  • Enfoques distintivos para problemas particulares:
    • Primitivas de concurrencia integradas: procesos livianos (goroutines), canales y la selectdeclaración.
    • Un sistema de interfaz en lugar de herencia virtual e incrustación de tipos en lugar de herencia no virtual.
    • Una cadena de herramientas que, de forma predeterminada, produce binarios nativos vinculados estáticamente sin dependencias externas.
  • Un deseo de mantener la especificación del lenguaje lo suficientemente simple como para mantenerla en la cabeza de un programador, [47] en parte omitiendo características que son comunes en lenguajes similares .

Sintaxis [ editar ]

La sintaxis de Go incluye cambios de C destinados a mantener el código conciso y legible. Se introdujo un operador combinado de declaración / inicialización que permite al programador escribir i := 3o s := "Hello, world!", sin especificar los tipos de variables utilizadas. Esto contrasta con C int i = 3;y const char *s = "Hello, world!";. Los puntos y comas todavía terminan declaraciones, [a] pero están implícitos cuando ocurre el final de una línea. [b] Los métodos pueden devolver varios valores, y devolver un result, errpar es la forma convencional en que un método indica un error a su llamador en Go. [c] Go agrega sintaxis literales para inicializar parámetros de estructura por nombre y para inicializar mapas y sectores.. Como alternativa al forciclo de tres instrucciones de C , las rangeexpresiones de Go permiten una iteración concisa sobre matrices, cortes, cadenas, mapas y canales. [50]

Tipos [ editar ]

Go tiene varios tipos integrados, incluidos los numéricos ( byte , int64 , float32 , etc.), booleanos y cadenas de caracteres ( cadena ). Las cadenas son inmutables; Los operadores y palabras clave incorporados (en lugar de funciones) proporcionan concatenación, comparación y codificación / decodificación UTF-8 . [51] Los tipos de registros se pueden definir con la palabra clave struct . [52]

Para cada tipo T y cada constante entera no negativa n , hay un tipo de matriz denotado [ n ] T ; las matrices de diferentes longitudes son, por tanto, de diferentes tipos. Las matrices dinámicas están disponibles como "rebanadas", denotado [] T para algún tipo T . Estos tienen una longitud y una capacidad que especifican cuándo es necesario asignar nueva memoria para expandir la matriz. Varias partes pueden compartir su memoria subyacente. [53] [54] [55]

Los punteros están disponibles para todos los tipos, y el puntero-a- T tipo se denota * T . La toma de direcciones y la indirección utilizan los operadores & y * , como en C, o suceden implícitamente a través de la sintaxis de llamada al método o acceso al atributo. [56] No hay aritmética de puntero, [d] excepto a través del tipo especial unsafe.Pointer en la biblioteca estándar. [57]

Para un par de tipos K , V , el tipo map [ K ] V es el tipo de tablas hash que mapean claves de tipo- K con valores de tipo- V . Las tablas hash están integradas en el lenguaje, con una sintaxis especial y funciones integradas. chan T es un canal que permite enviar valores de tipo T entre procesos Go concurrentes . [ cita requerida ]

Aparte de su soporte para interfaces , el sistema de tipos de Go es nominal : la palabra clave type se puede usar para definir un nuevo tipo con nombre , que es distinto de otros tipos con nombre que tienen el mismo diseño (en el caso de una estructura , los mismos miembros en el mismo orden). Algunas conversiones entre tipos (por ejemplo, entre los distintos tipos de enteros) están predefinidas y la adición de un nuevo tipo puede definir conversiones adicionales, pero las conversiones entre tipos con nombre siempre deben invocarse explícitamente. [58] Por ejemplo, la palabra clave type se puede usar para definir un tipo para direcciones IPv4 , basado en enteros sin signo de 32 bits:

escriba  ipv4addr  uint32

Con esta definición de tipo, ipv4addr (x) interpreta el valor x de uint32 como una dirección IP. Simplemente asignar x a una variable de tipo ipv4addr es un error de tipo. [ cita requerida ]

Las expresiones constantes pueden estar escritas o "sin escribir"; se les da un tipo cuando se asignan a una variable escrita si el valor que representan pasa una verificación en tiempo de compilación. [59]

Los tipos de función se indican mediante la palabra clave func ; toman cero o más parámetros y devuelven cero o más valores, todos los cuales se escriben. El parámetro y los valores de retorno determinan un tipo de función; por lo tanto, func (string, int32) (int, error) es el tipo de funciones que toman una cadena y un entero de 32 bits con signo, y devuelven un entero con signo (de ancho predeterminado) y un valor del tipo de interfaz incorporado error . [ cita requerida ]

Cualquier 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 verificar si su valor es un estándar conocido:

// ZeroBroadcast informa si la dirección es 255.255.255.255. func  ( addr  ipv4addr )  ZeroBroadcast ()  bool  {  return  addr  ==  0xFFFFFFFF }

Debido a la escritura 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 especial y una sintaxis de llamada, no existe un tipo de método distinto. [60]

Sistema de interfaz [ editar ]

Go proporciona dos características que reemplazan la herencia de clases . [ cita requerida ]

La primera es la incrustación , que puede verse como una forma automatizada de composición [61] o delegación . [62] : 255

El segundo son sus interfaces , que proporcionan polimorfismo en tiempo de ejecución . [63] : 266 Las interfaces son una clase de tipos y proporcionan una forma limitada de tipificación estructural en el sistema de tipos por lo demás nominal de Go. Un objeto que es de un tipo de interfaz también es de otro tipo, muy parecido a que los objetos de C ++ sean simultáneamente de una clase base y derivada. Las interfaces Go se diseñaron según los protocolos del lenguaje de programación Smalltalk. [64] Varias fuentes utilizan el término escritura de pato al describir las interfaces de Go. [65] [66]Aunque el término tipificación de pato no está definido con precisión y por lo tanto no es incorrecto, generalmente implica que la conformidad de tipo no se verifica estáticamente. Dado que el compilador de Go verifica estáticamente la conformidad con una interfaz de Go (excepto cuando se realiza una aserción de tipo), los autores de Go prefieren el término tipado estructural . [67]

La definición de un tipo de interfaz enumera los métodos necesarios por nombre y tipo. Cualquier objeto de tipo T para el que existan funciones que coincidan con todos los métodos requeridos de la interfaz de tipo I es también un objeto de tipo I. La definición de tipo T no necesita (y no puede) identificar el tipo I. Por ejemplo, si Forma , Cuadrado y Círculo se definen como

importar  "matemáticas"tipo  Interfaz de forma  { Area () float64 }   type  Square  struct  {  // Nota: no "implementa" el  lado de la  declaración float64 }func  ( cuadrado  cuadrado )  Área ()  float64  {  return  sq . lado  *  sq . lado  }type  Circle  struct  {  // No hay declaración de "implementa" aquí ni  radius  float64 }func  ( c  Círculo )  Área ()  float64  {  return  math . Pi  *  matemáticas . Pow ( c . Radio ,  2 )  }

entonces, tanto un Cuadrado como un Círculo son implícitamente una Forma y se pueden asignar a una variable de tipo Forma . [63] : 263–268 En lenguaje formal, el sistema de interfaz de Go proporciona mecanografía estructural en lugar de nominal . Las interfaces pueden incrustar otras interfaces con el efecto de crear una interfaz combinada que se satisfaga exactamente con los tipos que implementan la interfaz incrustada y cualquier método que agregue la interfaz recién definida. [63] : 270

La biblioteca estándar de Go utiliza interfaces para proporcionar genérico en varios lugares, incluido el sistema de entrada / salida que se basa en los conceptos de Reader y Writer . [63] : 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 , [68] que verifica contra un único tipo potencial, y el cambio de tipo , [69] que verifica contra múltiples tipos. [ cita requerida ]

La interfaz vacía interface{} es un caso base importante porque puede referirse a un elemento de cualquier tipo concreto. Es similar a la clase Object en Java o C # y se satisface con cualquier tipo, incluidos los tipos integrados como int . [63] : 284 El código que usa la interfaz vacía no puede simplemente llamar a métodos (u operadores integrados) en el objeto referido, pero puede almacenar el valor, tratar de convertirlo a un tipo más útil a través de una aserción de tipo o un tipo cambiar o inspeccionarlo con el paquete de Go . [70] Porqueinterface{}reflectinterface{}puede hacer referencia a cualquier valor, es una forma limitada de escapar de las restricciones de escritura estática, como void*en C, pero con comprobaciones de tipo en tiempo de ejecución adicionales. [ cita requerida ]

El interface{}tipo se puede utilizar para modelar datos estructurados de cualquier esquema arbitrario en Go, como datos JSON o YAML , representándolo como un map[string]interface{}(mapa de cadena a interfaz vacía). Esto describe datos de forma recursiva en forma de diccionario con claves de cadena y valores de cualquier tipo. [71]

Los valores de la interfaz se implementan usando un puntero a los datos y un segundo puntero a la información del tipo de tiempo de ejecución. [72] Como algunos otros tipos implementados usando punteros en Go, los valores de la interfaz están nilsin inicializar. [73]

Sistema de paquetes [ editar ]

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). Las referencias a las definiciones de otros paquetes siempre deben ir precedidas del nombre del otro paquete, y solo se puede acceder a los nombres en mayúscula de otros paquetes: io.Readeres público pero bzip2.readerno lo es. [74] El go getcomando puede recuperar paquetes almacenados en un repositorio remoto [75] y se anima a los desarrolladores a desarrollar paquetes dentro de una ruta base correspondiente 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. [76]

Existen propuestas para introducir una solución de gestión de paquetes adecuada para Go similar a CPAN para el sistema de carga de Perl o Rust o el sistema npm de Node . [77]

Simultaneidad: gorutinas y canales [ editar ]

El lenguaje Go tiene funciones integradas, así como soporte de biblioteca, para escribir programas simultáneos . La concurrencia se refiere no solo al paralelismo de la CPU, sino también a la asincronía : permitir que se ejecuten operaciones lentas como una lectura de la base de datos o la red mientras el programa realiza otro trabajo, como es común en los servidores basados ​​en eventos. [78]

La construcción de concurrencia principal es la goroutine , un tipo de proceso ligero . Una llamada de 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 subprocesos del sistema operativo , similar a la programación realizada en Erlang . [79] : 10

Mientras que un paquete de biblioteca estándar que presenta la mayoría de las estructuras clásicas de control de concurrencia ( bloqueos de mutex , etc.) está disponible, [79] : 151–152 programas concurrentes idiomáticos prefieren canales , que proporcionan mensajes de envío entre gorutinas. [80] Los búferes opcionales almacenan mensajes en orden FIFO [62] : 43 y permiten que el envío de goroutines continúe antes de que se reciban sus mensajes. [ cita requerida ]

Los canales se escriben, por lo que un canal de tipo Chan T sólo puede ser usado para transferir mensajes de tipo T . Se utiliza una sintaxis especial para operar con ellos; <-ch es una expresión que hace que la goroutine en ejecución se bloquee hasta que ingrese un valor sobre el canal ch , mientras que ch <- x envía el valor x (posiblemente bloqueando hasta que otra goroutine reciba el valor). La declaración de selección de tipo interruptor incorporado se puede utilizar para implementar la comunicación sin bloqueo en múltiples canales; ver abajopara un ejemplo. Go tiene un modelo de memoria que describe cómo las rutinas deben usar canales u otras operaciones para compartir datos de forma segura. [81]

La existencia de canales distingue a Go de lenguajes concurrentes al estilo de modelo de actor como Erlang, donde los mensajes se dirigen directamente a los actores (correspondientes a goroutines). El estilo de actor se puede simular en Go manteniendo una correspondencia uno a uno entre gorutinas y canales, pero el lenguaje permite que múltiples gorutinas compartan un canal o una sola gorutina para enviar y recibir en múltiples canales. [79] : 147

A partir de estas herramientas, se pueden crear construcciones simultáneas como grupos de trabajadores, canalizaciones (en las que, por ejemplo, un archivo se descomprime y analiza a medida que se descarga), llamadas en segundo plano con tiempo de espera, llamadas paralelas "desplegadas" a un conjunto de servicios y otras. . [82] 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 simultaneidad de búferes reciclados, [83] implementar corrutinas (que ayudaron a inspirar el nombre goroutine ), [84] e implementar iteradores . [85]

Las convenciones estructurales de Go relacionadas con la concurrencia ( canales y entradas de canales alternativos) se derivan del modelo de procesos secuenciales de comunicación de Tony Hoare . A diferencia de los lenguajes de programación concurrente anteriores como Occam o Limbo (un lenguaje en el que trabajó el co-diseñador de Go, Rob Pike), [86] Go no proporciona ninguna noción incorporada de concurrencia segura o verificable. [87] Si bien el modelo de procesos de comunicación se ve favorecido en Go, no es el único: todas las gorutinas de un programa comparten un solo espacio de direcciones. Esto significa que los objetos y punteros mutables se pueden compartir entre goroutines; ver § Falta de seguridad en las condiciones de carrera , más abajo. [cita requerida ]

Idoneidad para la programación paralela [ editar ]

Aunque las funciones de concurrencia de Go no están destinadas principalmente al procesamiento paralelo , [78] pueden usarse para programar máquinas multiprocesador de memoria compartida . Se han realizado varios estudios sobre la eficacia de este enfoque. [88] Uno de estos estudios comparó el tamaño (en líneas de código ) y la velocidad de los programas escritos por un programador experimentado que no está familiarizado con el lenguaje y las correcciones de estos programas por parte de un experto en Go (del equipo de desarrollo de Google), haciendo lo mismo para Capilla , Cilk e Intel TBB . El estudio encontró que los no expertos tendían a escribir algoritmos de divide y vencerás con unago por recursividad, mientras que el experto escribió programas distribuir-trabajar-sincronizar usando una goroutine por procesador. Los programas del experto solían ser más rápidos, pero también más largos. [89]

Falta de seguridad en las condiciones de carrera [ editar ]

No hay restricciones sobre cómo las goroutines acceden a los datos compartidos, lo que hace posible las condiciones de carrera . Específicamente, a menos que un programa se sincronice explícitamente a través de canales u otros medios, las escrituras de una gorutina pueden ser parcial, total o nada visibles para otra, a menudo sin garantías sobre el orden de las escrituras. [87] Además, las estructuras de datos internas de Go, como los valores de interfaz, los encabezados de segmento, las tablas hash y los encabezados de cadena no son inmunes a las condiciones de carrera, por lo que la seguridad del tipo y la memoria se puede violar en programas multiproceso que modifican instancias compartidas de esos tipos sin sincronización. [90] [91]En lugar de soporte de lenguaje, la programación concurrente segura se basa en convenciones; por ejemplo, Chisnall recomienda un modismo llamado "alias xor mutable", lo que significa que pasar un valor mutable (o puntero) sobre un canal indica una transferencia de propiedad sobre el valor a su receptor. [79] : 155

Binarios [ editar ]

El vinculador en la cadena de herramientas de gc crea binarios vinculados estáticamente de forma predeterminada, por lo tanto, todos los binarios de Go incluyen el tiempo de ejecución de Go. [92] [93]

Omisiones [ editar ]

Go omite deliberadamente ciertas características comunes en otros lenguajes, incluyendo herencia (implementación) , programación genérica , aserciones , aritmética de punteros [e] , [d] conversiones de tipos implícitas , uniones sin etiquetar , [f] y uniones etiquetadas . [g] Los diseñadores agregaron solo aquellas instalaciones que los tres acordaron. [96]

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 opción de omitir la herencia de tipos como un lenguaje más útil, alentando en cambio el uso de interfaces para lograr el despacho dinámico [h] y la composición para reutilizar el código. De hecho, la composición y la delegación se automatizan en gran medida mediante la incrustación de estructuras ; 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 detallada (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ático ", por lo que" no es obvio "si los programadores lo abusarán en la medida en que los programadores de otros lenguajes tengan fama de abusar de la herencia. [61]

Los diseñadores expresan su apertura a la programación genérica y señalan que las funciones integradas son de hecho genéricas de tipo, pero se tratan como casos especiales; Pike llama a esto una debilidad que puede cambiar en algún momento. [53] El equipo de Google creó al menos un compilador para un dialecto Go experimental con genéricos, pero no lo lanzó. [97] También están abiertos a estandarizar formas de aplicar la generación de código. [98] En junio de 2020, se publicó un nuevo borrador de documento de diseño [99] , que agregaría la sintaxis necesaria a Go para declarar funciones y tipos genéricos. Una herramienta de traducción de código go2gose proporcionó para permitir a los usuarios probar la nueva sintaxis, junto con una versión habilitada para genéricos de Go Playground en línea. [100]

Inicialmente omitido, finalmente se agregó el mecanismo de pánico / recuperación similar a una excepción , que los autores de Go recomiendan usar para errores irrecuperables, como aquellos que deberían detener un programa completo o una solicitud del servidor, o como un atajo para propagar errores en la pila dentro de un paquete (pero no a través de los límites del paquete; allí, las devoluciones de error son la API estándar). [101] [102] [103] [104]

Estilo [ editar ]

Los autores de Go hicieron un esfuerzo sustancial para influir en el estilo de los programas de Go:

  • La gofmtherramienta estandariza automáticamente la sangría, el espaciado y otros detalles del código a nivel de superficie . [105] golint realiza comprobaciones de estilo adicionales automáticamente. [ cita requerida ]
  • Las herramientas y bibliotecas distribuidas con Go sugieren enfoques estándar para cosas como documentación de API ( godoc), [106] pruebas ( go test), compilación ( go build), administración de paquetes ( go get), etc.
  • Go aplica reglas que son recomendaciones en otros lenguajes, por ejemplo, prohibir dependencias cíclicas, variables no utilizadas [107] o importaciones, [108] y conversiones de tipos implícitas.
  • La omisión de ciertas características (por ejemplo, atajos de programación funcional como mapy bloques try/ estilo Java finally) tiende a fomentar un estilo de programación particular, explícito, concreto e imperativo.
  • El primer día, el equipo de Go publicó una colección de modismos de Go, [106] y más tarde también recopiló comentarios de revisión de código, [109] charlas [110] y publicaciones de blogs oficiales [111] para enseñar el estilo y la filosofía de codificación de Go.

Herramientas [ editar ]

La distribución principal de Go incluye herramientas para crear , probar y analizar código:

  • go build, que crea binarios de Go utilizando solo la información de los archivos de origen, sin archivos MAKE separados
  • go test, para pruebas unitarias y microbenchmarks
  • go fmt, para formatear el código
  • go get, para recuperar e instalar paquetes remotos
  • go vet, un analizador estático que busca posibles errores en el código
  • go run, un atajo para compilar y ejecutar código
  • godoc, para mostrar documentación o servirla a través de HTTP
  • gorename, para cambiar el nombre de variables, funciones, etc. de forma segura para los tipos
  • go generate, una forma estándar de invocar generadores de código

También incluye soporte para la creación de perfiles y depuración , instrumentación en tiempo de ejecución (por ejemplo, para rastrear las pausas de recolección de basura ) y un probador de condición de carrera .

Un ecosistema de herramientas de terceros se suma a la distribución estándar, como, por ejemplo 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 errcheckque detecta código que podría ignorar errores involuntariamente.

Ejemplos [ editar ]

Hola mundo [ editar ]

paquete  principalimportar  "fmt"func  main ()  {  fmt . Println ( "¡Hola, mundo!" ) }

donde "FMT" es el paquete de formato I / O , similar a la de C de entrada de archivo C / salida . [112]

Simultaneidad [ editar ]

El siguiente programa simple demuestra las características de concurrencia de Go para implementar un programa asincrónico. Lanza dos hilos ligeros ("goroutines"): uno espera que el usuario escriba algún texto, mientras que el otro implementa un tiempo de espera. La instrucción select espera a que cualquiera de estas goroutines envíe un mensaje a la rutina principal y actúa sobre el primer mensaje que llega (ejemplo adaptado del libro de David Chisnall). [79] : 152

paquete  principalimportar  (  "fmt"  "tiempo" )func  readword ( cadena ch  chan  ) { fmt . Println ( "Escriba una palabra, luego presione Enter." ) Var word string fmt . Scanf ( "% s" , & palabra ) ch <- palabra }          func  timeout ( t  chan  bool )  {  tiempo . Dormir ( 5  *  tiempo . Segundo )  t  <-  falso }func  main ()  {  t  : =  make ( chan  bool )  go  timeout ( t ) ch  : =  hacer ( cadena chan  ) ir readword ( ch )   seleccione  {  palabra de caso  : = <- ch : fmt . Println ( "Recibido" , palabra ) mayúsculas y minúsculas <- t : fmt . Println ( "Tiempo de espera" ) } }        

Probando [ editar ]

El paquete de prueba proporciona soporte para pruebas automatizadas de paquetes go. [113] Ejemplo de función de destino:

func  ExtractUsername ( cadena de correo electrónico  ) cadena { en : = cadenas . Índice ( correo electrónico , "@" ) devolver el correo electrónico [: at ] }      

Código de prueba (tenga en cuenta que falta la palabra clave assert en Go; las pruebas se encuentran en <filename> _test.go en el mismo paquete):

importar  (  "prueba"  )func  TestExtractUsername ( t  * testing . T )  { t . Ejecute ( "withoutDot" ,  func ( t  * testing . T )  { username  : =  ExtractUsername ( "[email protected]" ) if  username  ! =  "R"  { t . Fatalf ( "Got:% v \ n" ,  username ) } })t . Ejecute ( "withDot" ,  func ( t  * testing . T )  { username  : =  ExtractUsername ( "[email protected]" ) if  username  ! =  "Jonh.smith"  { t . Fatalf ( "Got:% v \ n " ,  nombre de usuario ) } })}

Es posible ejecutar pruebas en paralelo.

Aplicación web [ editar ]

El paquete net / http brinda soporte para la creación de aplicaciones web.

Este ejemplo mostraría "¡Hola mundo!" cuando se visita localhost: 8080.

importar  (  "fmt"  "log"  "net / http"  )func  helloFunc ( w  http . ResponseWriter ,  r  * http . Request )  {  fmt . Fprintf ( w , "¡Hola mundo!" ) }func  main ()  {  http . HandleFunc ( "/" , helloFunc )  registro . Fatal ( http . ListenAndServe ( ": 8080" ,  nil )) }

Aplicaciones [ editar ]

Algunas aplicaciones notables de código abierto escritas en Go incluyen: [114]

  • Caddy , un servidor web HTTP / 2 de código abierto con capacidad HTTPS automática
  • CockroachDB , una base de datos SQL escalable, de código abierto, sobrevivible, fuertemente consistente
  • Docker , un conjunto de herramientas para implementar contenedores de Linux
  • EdgeX , una plataforma de código abierto independiente del proveedor alojada por la Fundación Linux , que proporciona un marco común para la informática de borde de IoT industrial [115]
  • Hugo , un generador de sitios estáticos
  • InfluxDB , una base de datos de código abierto específicamente para manejar datos de series de tiempo con alta disponibilidad y requisitos de alto rendimiento
  • InterPlanetary File System , un protocolo hipermedia peer-to-peer con contenido direccionable [116]
  • Juju , una herramienta de orquestación de servicios de Canonical , empaquetadores de Ubuntu Linux
  • Sistema de gestión de contenedores de Kubernetes
  • lnd, una implementación de Bitcoin Lightning Network [117]
  • Mattermost , un sistema de chat en equipo
  • NATS Messaging , un sistema de mensajería de código abierto que presenta los principios básicos de diseño de rendimiento, escalabilidad y facilidad de uso [118]
  • OpenShift , una plataforma de computación en la nube como servicio de Red Hat
  • Rclone , un programa de línea de comandos para administrar archivos en el almacenamiento en la nube y otros servicios de alta latencia
  • Snappy , un administrador 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 HTAP distribuida de código abierto compatible con el protocolo MySQL de PingCAP

Otras empresas y sitios notables que utilizan Go (generalmente junto con otros idiomas, no exclusivamente) incluyen:

  • Cacoo , por su representación de la página del panel del usuario y el microservicio mediante Go y gRPC [119]
  • Chango , una empresa de publicidad programática utiliza Go en sus sistemas de licitación en tiempo real [120]
  • Cloud Foundry , una plataforma como servicio [121]
  • Cloudflare , por su proxy de codificación delta Railgun, su servicio de DNS distribuido, así como herramientas para criptografía, registro, procesamiento de secuencias y acceso a sitios SPDY [122] [123]
  • Container Linux (anteriormente CoreOS), un sistema operativo basado en Linux que usa contenedores Docker [124] y contenedores rkt
  • Servicios Couchbase , Query and Indexing dentro del Couchbase Server [125]
  • Dropbox , que migró algunos de sus componentes críticos de Python a Go [126]
  • Ethereum , la implementación go-ethereum de la cadena de bloques de la máquina virtual Ethereum para la criptomoneda Ether [127]
  • Gitlab , una herramienta de ciclo de vida de DevOps basada en la web que proporciona un Git : repositorio , wiki , seguimiento de problemas , integración continua , funciones de canalización de implementación [128]
  • Google , para muchos proyectos, en particular, incluido el servidor de descargas dl.google.com [129] [130] [131]
  • Heroku , para Doozer, un servicio de bloqueo [13]
  • Hyperledger Fabric , un proyecto de libro mayor distribuido de código abierto y centrado en la empresa
  • MongoDB , herramientas para administrar instancias de MongoDB [132]
  • Netflix , para dos partes de su arquitectura de servidor [133]
  • Nutanix , para una variedad de microservicios en su SO Enterprise Cloud [134]
  • Plug.dj , un sitio web interactivo de transmisión de música social en línea [135]
  • SendGrid , un servicio de administración y entrega de correo electrónico transaccional con sede en Boulder, Colorado. [136]
  • SoundCloud , para "docenas de sistemas" [137]
  • Empalme , para todo el backend (API y analizadores) de su plataforma de colaboración musical en línea [138]
  • ThoughtWorks , algunas herramientas y aplicaciones para la entrega continua y la mensajería instantánea (CoyIM) [139]
  • Twitch , para su sistema de chat basado en IRC (migrado desde Python) [140]
  • Uber , para manejar grandes volúmenes de consultas basadas en geovallas [141]


Consulte también la consulta relacionada con Wikidata .

Recepción [ editar ]

El sistema de interfaz, y la omisión deliberada de la herencia, fueron elogiados por Michele Simionato, quien comparó estas características con las del ML estándar , calificándolo de "una vergüenza que ningún lenguaje popular haya seguido [esta] ruta en particular". [142]

Dave Astels en Engine Yard escribió: [143]

Go es extremadamente fácil de sumergirse. Hay un número mínimo de conceptos lingüísticos fundamentales y la sintaxis es limpia y está diseñada para ser clara e inequívoca. Go todavía es experimental y todavía un poco tosco en los bordes.

Go fue nombrado Lenguaje de programación del año por el Índice de la comunidad de programación de TIOBE en su primer año, 2009, por tener un aumento de popularidad de 12 meses más grande (en solo 2 meses, después de su introducción en noviembre) que cualquier otro idioma ese año. y alcanzó el puesto 13 en enero de 2010, [144] superando idiomas establecidos como Pascal . Para junio de 2015, su clasificación había caído por debajo del puesto 50 en el índice, colocándolo por debajo de COBOL y Fortran . [145] Pero a partir de 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 galardonado con el lenguaje de programación TIOBE del año 2016.

Bruce Eckel ha declarado: [146]

La complejidad de C ++ (se ha agregado aún más complejidad en el nuevo C ++) y el impacto resultante en la productividad ya no está justificado. Todos los obstáculos que tuvo que superar el programador de C ++ para utilizar un lenguaje compatible con C ya no tienen sentido: son solo una pérdida de tiempo y esfuerzo. Go tiene mucho más sentido para la clase de problemas que C ++ originalmente tenía la intención de resolver.

Una evaluación de 2011 del lenguaje y su implementación de gc en comparación con C ++ ( GCC ), Java y Scala por un ingeniero de Google encontró:

Go ofrece interesantes funciones de lenguaje, que también permiten una notación concisa y estandarizada. Los compiladores de este lenguaje aún son inmaduros, lo que se refleja tanto en el rendimiento como en los tamaños binarios.

-  R. Hundt [147]

La evaluación recibió una refutación del equipo de desarrollo de Go. Ian Lance Taylor, que había mejorado el código de Go para el artículo de Hundt, no había sido consciente de la intención de publicar su código y dice que su versión "nunca tuvo la intención de ser un ejemplo de Go idiomático o eficiente"; Luego, Russ Cox optimizó el código Go, así como el código C ++, y consiguió que el código Go se ejecutara un poco más rápido que C ++ y más de un orden de magnitud más rápido que el código del documento. [148]

Disputa de nombre [ editar ]

El 10 de noviembre de 2009, el día del lanzamiento general del lenguaje, Francis McCabe, desarrollador de Go! lenguaje de programación (nótese el signo de exclamación), solicitó un cambio de nombre del lenguaje de Google para evitar confusiones con su lenguaje, que había pasado 10 años desarrollando. [149] McCabe expresó su preocupación de que "el 'gran tipo' acabará aplastándolo", y esta preocupación resonó entre los más de 120 desarrolladores que comentaron sobre el hilo de problemas oficiales de Google diciendo que deberían cambiar el nombre, con algunos [ 150] incluso diciendo que el problema contradice el lema de Google de: No seas malvado . [151]

El 12 de octubre de 2010, el desarrollador de Google Russ Cox (@rsc) cerró el problema con el estado personalizado "Desafortunado" acompañado del siguiente comentario:

"Hay muchos productos y servicios informáticos llamados Go. En los 11 meses desde nuestro lanzamiento, ha habido una mínima confusión de los dos idiomas". [151]

Crítica [ editar ]

Van los críticos dicen que:

  • La falta de polimorfismo paramétrico para la programación genérica conduce a la duplicación de código o conversiones de tipos inseguras y una verbosidad que interrumpe el flujo. [152] [153] [154] [155]
  • Go's nil combinado con la falta de tipos algebraicos conduce a dificultades para manejar fallas y casos base . [152] [154]
  • Go no permite que aparezca una llave de apertura en su propia línea, lo que obliga a todos los programadores de Go a utilizar el mismo estilo de llave. [156]
  • La semántica de archivos en la biblioteca estándar de Go se basa en gran medida en la semántica POSIX y no se asigna bien a la plataforma Windows . [157] [158] Tenga en cuenta que este problema no es particular de Go, pero otros lenguajes de programación lo han resuelto mediante bibliotecas estándar bien definidas. El autor también argumenta que la simplicidad de Go es una ilusión y que para resolver problemas del mundo real, es necesario incorporar bibliotecas con dependencias sorprendentemente grandes para resolver algo tan simple como implementar una función de tiempo que aumenta monótonamente.

Ver también [ editar ]

  • Comparación de lenguajes de programación

Notas [ editar ]

  1. ^ Pero "Para permitir que las declaraciones complejas ocupen una sola línea, se puede omitir un punto y coma antes de un cierre) o}". [48]
  2. ^ “Si la nueva línea viene después de un token que podría terminar una declaración, [el lexer] insertará un punto y coma”. [49]
  3. ^ Por lo general, exactamente uno de los valores de resultado y error tiene un valor diferente al valor cero del tipo; a veces ambos lo hacen, como cuando una lectura o escritura solo se puede completar parcialmente, y a veces ninguna, como cuando una lectura devuelve 0 bytes. Consulte Problema semipredicado: rendimiento multivalor .
  4. ^ a b Preguntas frecuentes sobre el lenguaje "¿Por qué no hay aritmética de puntero? Seguridad ... nunca derive una dirección ilegal que tenga éxito incorrectamente ... el uso de índices de matriz puede ser tan eficiente como ... la aritmética de puntero ... simplificar la implementación del recolector de basura ...". [12]
  5. ^ Preguntas frecuentes sobre el lenguaje "¿Por qué Go no tiene afirmaciones? ... nuestra experiencia ha sido que los programadores las usan como una muleta para evitar pensar en el manejo y reporte de errores adecuados ...". [12]
  6. ^ Preguntas frecuentes sobre el idioma "¿Por qué no hay uniones sin etiquetar ...? [Ellos] violarían las garantías de seguridad de la memoria de Go". [12]
  7. ^ Preguntas frecuentes sobre el lenguaje "¿Por qué Go no tiene tipos de variantes? ... Los consideramos [pero] se superponen de manera confusa con las interfaces ... [Algunos] de los tipos de variantes ya están cubiertos, ... aunque no con tanta elegancia". [12] (Seaccede a laetiqueta de un tipo de interfaz [94] con una afirmación de tipo [95] ).
  8. ^ Preguntas "¿Cómo obtengo el envío dinámico de métodos?" y "¿Por qué no hay herencia de tipo?" en las preguntas frecuentes del idioma. [12]

Referencias [ editar ]

  1. ^ "Funciones de primera clase en Go" . Consultado el 14 de noviembre de 2018 . Go admite ... un estilo de programación funcional en un lenguaje fuertemente tipado.
  2. ^ "¿Go es 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.
  3. ^ "Go: código que crece con gracia" . Consultado el 24 de junio de 2018 . Go está orientado a objetos, pero no de la forma habitual.
  4. ^ a b "LICENCIA de archivo de texto" . El lenguaje de programación Go . Consultado el 5 de octubre de 2012 .
  5. ^ "Historial de versiones" . Consultado el 13 de marzo de 2021 .
  6. ^ a b "¿Por qué Go no tiene declaraciones" implementa "?" . golang.org . Consultado el 1 de octubre de 2015 .
  7. ^ Pike, Rob (22 de diciembre de 2014). "Rob Pike en Twitter" . Consultado el 13 de marzo de 2016 . Go tiene escritura estructural, no escritura pato. Se comprueba y se requiere la satisfacción total de la interfaz.
  8. ^ "lang / go: go-1.4 - Ir al lenguaje de programación" . Puertos OpenBSD . 23 de diciembre de 2014 . Consultado el 19 de enero de 2015 .
  9. ^ "Ir a portar esfuerzos" . Ir a recursos lingüísticos . cat-v. 12 de enero de 2010 . Consultado el 18 de enero de 2010 .
  10. ^ "Concesión de derechos de propiedad intelectual adicionales" . El lenguaje de programación Go . Consultado el 5 de octubre de 2012 .
  11. ^ Kincaid, Jason (10 de noviembre de 2009). "Go de Google: un nuevo lenguaje de programación que Python cumple con C ++" . TechCrunch . Consultado el 18 de enero de 2010 .
  12. ^ a b c d e f "Preguntas frecuentes sobre diseño de idiomas" . golang.org . 16 de enero de 2010 . Consultado el 27 de febrero de 2010 .
  13. ↑ a b Metz, Cade (5 de mayo de 2011). "Google Go va audazmente donde ningún código ha ido antes" . El registro .
  14. ^ "¿El idioma se llama Go o Golang?" . Consultado el 26 de marzo de 2020 . El idioma se llama Go.
  15. ^ "Notas de la versión Go 1.5" . Consultado el 28 de enero de 2016 . El compilador y el tiempo de ejecución ahora se implementan en Go y ensamblador, sin C.
  16. ^ "Se lanza Go 1.11 - The Go Blog" . 24 de agosto de 2018 . Consultado el 1 de enero de 2019 .
  17. ^ "Preguntas frecuentes: implementación" . golang.org . 16 de enero de 2010 . Consultado el 18 de enero de 2010 .
  18. ^ "Instalación de GCC: Configuración" . Consultado el 3 de diciembre de 2011 . Ada, Go y Objective-C ++ no son idiomas predeterminados
  19. ^ "Un compilador de Go to JavaScript para ejecutar código Go en un navegador: Gopherjs / Gopherjs" . 18 de abril de 2020.
  20. ^ "Ir a Google: diseño de idiomas en el servicio de ingeniería de software" . Consultado el 8 de octubre de 2018 .
  21. ^ Pike, Rob (28 de abril de 2010). "Otro intento en el diseño de idiomas" . Coloquio sobre sistemas informáticos de Stanford EE . Universidad de Stanford . Video disponible .
  22. ^ "Preguntas más frecuentes (FAQ) - El lenguaje de programación Go" . golang.org . Consultado el 26 de febrero de 2016 .
  23. ^ Binstock, Andrew (18 de mayo de 2011). "Dr. Dobb's: entrevista con Ken Thompson" . Consultado el 7 de febrero de 2014 .
  24. ^ Pike, Rob (2012). "Menos es exponencialmente más" .
  25. ^ Griesemer, Robert (2015). "La evolución de Go" .
  26. ^ Griesemer, Robert; Pike, Rob; Thompson, Ken; Taylor, Ian; Cox, Russ; Kim, Jini; Langley, Adam. "¡Hey! ¡Ho! ¡Vamos!" . Código abierto de Google . Consultado el 17 de mayo de 2018 .
  27. ^ Shankland, Stephen (30 de marzo de 2012). "El lenguaje Go de Google cumple uno, gana un lugar en YouTube: el lenguaje de programación de nivel inferior ha madurado lo suficiente como para lucir el número de versión 1.0. Y se está utilizando para el trabajo real en Google" . Noticias. CNet . CBS Interactive Inc . Consultado el 6 de agosto de 2017 . Google ha lanzado la versión 1 de su lenguaje de programación Go, un ambicioso intento de mejorar a los gigantes del mundo de la programación de bajo nivel como C y C ++.
  28. ^ "Historial de versiones: el lenguaje de programación Go" . golang.org .
  29. ^ "Preguntas frecuentes sobre Go: ¿Google utiliza Go internamente?" . Consultado el 9 de marzo de 2013 .
  30. ^ "Fuentes Go - The Go Blog" . Vamos. 16 de noviembre de 2016 . Consultado el 12 de marzo de 2019 .
  31. ^ "Ir a TTF de fuente" . GitHub . Consultado el 2 de abril de 2019 .
  32. ^ "Nueva marca de Go" . El blog de Go . Consultado el 9 de noviembre de 2018 .
  33. ^ "Vaya 2 borradores de diseños" . Consultado el 12 de septiembre de 2018 .
  34. ^ "El blog de Go: Go 2 borradores de diseños" . 28 de agosto de 2018.
  35. ^ "Go 1 y el futuro de los programas Go - El lenguaje de programación Go" . golang.org .
  36. ^ "Notas de la versión Go 1.14 - El lenguaje de programación Go" . golang.org .
  37. ^ "Historial de versiones: el lenguaje de programación Go" . golang.org .
  38. ^ "Historial de versiones" . El lenguaje de programación Go . Consultado el 24 de agosto de 2018 .
  39. ^ "Notas de la versión Go 1.11 - el lenguaje de programación Go" .
  40. ^ "Comprensión de la autenticación mutua de Golang TLS DoS - CVE-2018-16875" . 19 de diciembre de 2018.
  41. ^ "Trabajar con errores en Go 1.13 - El blog de Go" . blog.golang.org . Consultado el 11 de marzo de 2021 . Go 1.13 introduce nuevas funciones a los paquetes de biblioteca estándar de errores y fmt para simplificar el trabajo con errores que contienen otros errores. El más significativo de ellos es una convención en lugar de un cambio: un error que contiene otro puede implementar un método Unwrap que devuelve el error subyacente. Si e1.Unwrap () devuelve e2, entonces decimos que e1 envuelve e2, y que puede desenvolver e1 para obtener e2.
  42. ^ a b "Notas de la versión Go 1.14: el lenguaje de programación Go" .
  43. ^ Pike, Rob. "El lenguaje de programación Go" . YouTube . Consultado el 1 de julio de 2011 .
  44. ^ Pike, Rob (10 de noviembre de 2009). El lenguaje de programación Go (flv) (charla técnica). Google. El evento ocurre a las 8:53.
  45. ^ Descargue e instale paquetes y dependencias - vaya - El lenguaje de programación Go ; consulte godoc.org para obtener direcciones y documentación de algunos paquetes.
  46. ^ "GoDoc" . godoc.org .
  47. ^ Rob Pike, en el podcast de Changelog .
  48. ^ "Ir a la especificación del lenguaje de programación, §Semicolons" . golang.org .
  49. ^ "Vaya eficaz, §Semicolons" . golang.org .
  50. ^ https://golang.org/ref/spec#For_statements
  51. Rob Pike, Strings, bytes, runes and characters in Go , 23 de octubre de 2013.
  52. ^ Doxsey, Caleb. "Estructuras e interfaces: una introducción a la programación en Go" . www.golang-book.com . Consultado el 15 de octubre de 2018 .
  53. ↑ a b Pike, Rob (26 de septiembre de 2013). "Matrices, rebanadas (y cadenas): la mecánica de 'agregar ' " . El blog de Go . Consultado el 7 de marzo de 2015 .
  54. ^ Andrew Gerrand, Go Slices: uso y aspectos internos .
  55. ^ Los autores de Go, Effective Go: Slices .
  56. ^ Selectores de autores de Go - Especificación y llamadas del lenguaje de programación Go - Especificación del lenguaje de programación Go .
  57. ^ "Ir a la especificación del lenguaje de programación, §Paquete inseguro" . golang.org .
  58. ^ "La especificación del lenguaje de programación Go" . golang.org .
  59. ^ "La especificación del lenguaje de programación Go" . golang.org .
  60. ^ "La especificación del lenguaje de programación Go" . golang.org .
  61. ^ a b 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.
  62. ↑ a b Summerfield, Mark (2012). Programación en Go: creación de aplicaciones para el siglo XXI . Addison-Wesley.
  63. ↑ a b c d e Balbaert, Ivo (2012). El camino a seguir: una introducción completa al lenguaje de programación Go . iUniverse.
  64. ^ "La evolución de Go" . talk.golang.org . Consultado el 13 de marzo de 2016 .
  65. ^ Diggins, Christopher (24 de noviembre de 2009). "Duck Typing y el lenguaje de programación Go" . Dr. Dobb's . Consultado el 10 de marzo de 2016 .
  66. ^ Ryer, Mat (1 de diciembre de 2015). "Duck escribiendo en Go" . Consultado el 10 de marzo de 2016 .
  67. ^ "Preguntas más frecuentes (FAQ) - El lenguaje de programación Go" . golang.org .
  68. ^ "La especificación del lenguaje de programación Go" . golang.org .
  69. ^ "La especificación del lenguaje de programación Go" . golang.org .
  70. ^ reflect.ValueOf (i interface {}) convierte an eninterface{}areflect.Valueque se puede inspeccionar más a fondo
  71. ^ "interfaz de mapa [cadena] {} en Ir" . bitfieldconsulting.com .
  72. ^ "Ir a estructuras de datos: interfaces" . Consultado el 15 de noviembre de 2012 .
  73. ^ "La especificación del lenguaje de programación Go" . golang.org .
  74. ^ "Un 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 estructura) está en mayúscula, los usuarios del paquete pueden verlo. De lo contrario, el nombre y, por lo tanto, la cosa que se nombra son visibles solo dentro del paquete en el que se declara.
  75. ^ "go - El lenguaje de programación Go" . golang.org .
  76. ^ "Cómo escribir código Go" . golang.org . Los paquetes de la biblioteca estándar reciben rutas de importación cortas como "fmt" y "net / http". Para sus propios paquetes, debe elegir una ruta base que probablemente no colisionará con futuras adiciones a la biblioteca estándar u otras bibliotecas externas. Si mantiene su código en un repositorio de fuentes en algún lugar, entonces debe usar la raíz de ese repositorio de fuentes como su ruta base. Por ejemplo, si tiene una cuenta de ejemplo en example.com/user, esa debería ser su ruta base
  77. ^ "Ir al proceso de propuesta de embalaje" . Documentos de Google .
  78. ^ a b Rob Pike, La concurrencia no es paralelismo .
  79. ↑ a b c d e Chisnall, David (2012). El libro de frases del lenguaje de programación Go . Addison-Wesley. ISBN 9780132919005.
  80. ^ "Go eficaz" . golang.org .
  81. ^ "El modelo de memoria Go" . Consultado el 10 de abril de 2017 .
  82. ^ "Ir a patrones de concurrencia" . golang.org .
  83. ^ John Graham-Cumming, Reciclaje de búferes de memoria en Go
  84. ^ "tree.go" .
  85. ^ Ewen Cheslack-Postava, Iteradores en Go .
  86. ^ Brian W. Kernighan, Un descenso al limbo
  87. ^ a b "El modelo de memoria Go" . Consultado el 5 de enero de 2011 .
  88. ^ Tang, Peiyi (2010). Programación paralela multinúcleo en Go (PDF) . Proc. Primer Congreso Internacional de Computación y Comunicaciones Avanzadas.
  89. 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 .  
  90. ^ Russ Cox , a las carreras .
  91. ^ Pike, Rob (25 de octubre de 2012). "Ir a Google: el diseño del lenguaje al servicio de la ingeniería de software" . Corporación Google. "Hay una advertencia importante: Go no es puramente seguro para la memoria en presencia de concurrencia".
  92. ^ "Preguntas más frecuentes (FAQ) - el lenguaje de programación Go" .
  93. ^ "Una historia de un binario Fat Go" . 21 de septiembre de 2018.
  94. ^ "Ir a la especificación del lenguaje de programación, §Tipos de interfaz" . golang.org .
  95. ^ "Ir a la especificación del lenguaje de programación, aseveraciones §Type" . golang.org .
  96. ^ Todos los sistemas están listos . informIT . 17 de agosto de 2010 . Consultado el 21 de junio de 2018 .
  97. ^ "E2E: Erik Meijer y Robert Griesemer - Going Go" . Canal 9 . Microsoft. 7 de mayo de 2012.
  98. ^ Rob Pike, Generando código
  99. ^ "Parámetros de tipo - Proyecto de diseño" . go.googlesource.com .
  100. ^ "Genéricos en Go" . bitfieldconsulting.com .
  101. ^ Pánico y recuperación , Go wiki
  102. ^ "Historial de instantáneas semanal" . golang.org .
  103. ^ "Propuesta de un mecanismo similar a una excepción" . nueces de golang . 25 de marzo de 2010 . Consultado el 25 de marzo de 2010 .
  104. ^ "Go eficaz" . golang.org .
  105. ^ "gofmt - El lenguaje de programación Go" . golang.org . Consultado el 5 de febrero de 2021 .
  106. ^ a b "Salida efectiva" . golang.org .
  107. ^ "Variables locales no utilizadas" . yourbasic.org . Consultado el 11 de febrero de 2021 .
  108. ^ "Importaciones de paquetes no utilizados" . yourbasic.org . Consultado el 11 de febrero de 2021 .
  109. ^ "Comentarios de revisión de código" . Consultado el 3 de julio de 2018 .
  110. ^ "Charlas" . Consultado el 3 de julio de 2018 .
  111. ^ "Los errores son valores" . Consultado el 3 de julio de 2018 .
  112. ^ "fmt - El lenguaje de programación Go" . golang.org . Consultado el 8 de abril de 2019 .
  113. ^ "prueba - El lenguaje de programación Go" . golang.org . Consultado el 27 de diciembre de 2020 .
  114. ^ avelino / awesome-go: una lista seleccionada de increíbles frameworks, bibliotecas y software de Go , recuperado el 10 de enero de 2018
  115. ^ "Proyecto de fundición EdgeX" . GitHub . Consultado el 6 de febrero de 2021 .
  116. ^ "ipfs / go-ipfs" . GitHub . Consultado el 1 de junio de 2018 .
  117. ^ "lightningnetwork / lnd" , GitHub , consultado el 29 de abril de 2020
  118. ^ "NATS - Sistema de mensajería de código abierto | Desarrollo de aplicaciones nativas y seguras en la nube" .
  119. ^ "Desarrollo impulsado por pruebas en Go | Cacoo" . Cacoo . 29 de julio de 2016 . Consultado el 1 de junio de 2018 .
  120. ^ "Chango" . GitHub .
  121. ^ Heller, Martin (17 de julio de 2014). "Revisión: Cloud Foundry aporta potencia y pulido a PaaS" . JavaWorld . Consultado el 22 de enero de 2019 .
  122. ^ John Graham-Cumming, vaya a CloudFlare
  123. ^ John Graham-Cumming, Qué hemos estado haciendo con Go
  124. ^ "Ir a CoreOS" . 25 de noviembre de 2014.
  125. ^ "Couchbase" . GitHub .
  126. ^ Patrick Lee, Abastecimiento de nuestras bibliotecas Go , 7 de julio de 2014.
  127. ^ "Implementación oficial de Go del protocolo Ethereum" . GitHub . ethereum. 18 de abril de 2020.
  128. ^ "Por qué usamos Ruby on Rails para construir GitLab" . GitLab . Consultado el 6 de febrero de 2021 . Ruby fue optimizado para el desarrollador, no para ejecutarlo en producción ", dice Sid." Para las cosas que se golpean mucho y tienen que ser muy eficaces o que, por ejemplo, tienen que esperar mucho tiempo en un sistema de E / S, nosotros reescriba los de Go… Todavía estamos tratando de hacer que GitLab use menos memoria. Por lo tanto, necesitaremos habilitar el subproceso múltiple. Cuando desarrollamos GitLab, eso no era común en el ecosistema de Ruby on Rails. Ahora es más común, pero debido a que ahora tenemos tanto código y tantas dependencias, será un camino más largo para llegar allí. Eso debería ayudar; no lo hará increíblemente rápido, pero al menos usará menos memoria
  129. ^ "dl.google.com: con tecnología de Go" . golang.org .
  130. ^ Matt Welsh, reescritura de un gran sistema de producción en Go
  131. ^ David Symonds, aplicaciones de alto rendimiento en Google App Engine
  132. ^ "Mongo DB" . GitHub . 18 de abril de 2020.
  133. ^ "The Netflix Tech Blog: almacenamiento en caché de datos de aplicaciones mediante SSD" . 25 de mayo de 2016.
  134. ^ "golang / go" . GitHub . 18 de abril de 2020.
  135. ^ Steven Sacks. "Búsqueda y avances" . plug.dj blog de tecnología . Archivado desde el original el 11 de junio de 2015 . Consultado el 10 de junio de 2015 .
  136. ^ Tim Jenkins (6 de marzo de 2014). "Cómo convencer a su empresa de que opte por Golang" . Blog de capacidad de entrega de correo electrónico de SendGrid .
  137. ^ Peter Bourgon, Go at SoundCloud Archivado el 11 de noviembre de 2013 en Wayback Machine
  138. ^ "Ir a Google I / O y Gopher SummerFest - The Go Blog" . golang.org .
  139. ^ TWSTRIKE (17 de abril de 2020). "CoyIM" . Equipo de ThoughtWorks STRIKE .
  140. ^ Rhys Hiltner, Marcha de Go a GC de baja latencia , 5 de julio de 2016.
  141. ^ "Cómo construimos el servicio más alto de consultas por segundo de Uber Engineering usando Go" . Blog de ingeniería de Uber . 24 de febrero de 2016 . Consultado el 2 de marzo de 2016 .
  142. ^ Simionato, Michele (15 de noviembre de 2009). "Interfaces vs herencia (o, ¡cuidado con Go!)" . artima . Consultado el 15 de noviembre de 2009 .
  143. ^ Astels, Dave (9 de noviembre de 2009). "¡En sus marcas, listos, fuera!" . patio de máquinas . Consultado el 9 de noviembre de 2009 .
  144. ^ 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 .
  145. ^ "Índice de la comunidad de programación de TIOBE para junio de 2015" . Software TIOBE. Junio ​​de 2015 . Consultado el 5 de julio de 2015 .
  146. ^ Bruce Eckel (27 de agosto de 2011). "Llamar a Go desde Python a través de JSON-RPC" . Consultado el 29 de agosto de 2011 .
  147. ^ Hundt, Robert (2011). Reconocimiento de bucles en C ++ / Java / Go / Scala (PDF) . Días Scala.
  148. ^ Metz, Cade (1 de julio de 2011). "Google Go contraataca con C ++ bake-off" . El registro .
  149. ^ Brownlee, John (13 de noviembre de 2009). "Google no buscó en Google" Go "antes de nombrar su lenguaje de programación ' " .
  150. ^ Claburn, Thomas (11 de noviembre de 2009). "El nombre de Google 'Go' trae acusaciones de maldad ' " . InformationWeek . Consultado el 18 de enero de 2010 .
  151. ^ a b "Edición 9 - adelante - Ya he usado el nombre para * MI * lenguaje de programación" . Github . Google Inc. Consultado el 12 de octubre de 2010 .
  152. ^ a b Yager, Will. "Por qué ir no es bueno" . Consultado el 4 de noviembre de 2018 .
  153. ^ Elbre, Egon. "Resumen de las discusiones de Go Generics" . Consultado el 4 de noviembre de 2018 .
  154. ↑ a b Dobronszki, Janos. "Problemas cotidianos en Go" . Consultado el 4 de noviembre de 2018 .
  155. ^ Fitzpatrick, Brad. "Ir: 90% perfecto, el 100% del tiempo" . Consultado el 28 de enero de 2016 .
  156. ^ "¿Por qué hay llaves pero no punto y coma? ¿Y por qué no puedo poner la llave de apertura en la siguiente línea?" . Consultado el 26 de marzo de 2020 . Las ventajas de un formato único ordenado mediante programación para todos los programas de Go superan en gran medida las desventajas percibidas del estilo en particular.
  157. ^ "Quiero fuera de Wild Ride del Sr. Golang" . 28 de febrero de 2020 . Consultado el 17 de noviembre de 2020 .
  158. ^ "propuesta: os: Create / Open / OpenFile () set FILE_SHARE_DELETE en Windows # 32088" . 16 de mayo de 2019 . Consultado el 17 de noviembre de 2020 .

Lectura adicional [ editar ]

  • Donovan, Alan; Kernighan, Brian (octubre de 2015). El lenguaje de programación Go (1ª ed.). Addison-Wesley Professional . pag. 400. ISBN 978-0-13-419044-0.

Enlaces externos [ editar ]

  • Página web oficial