Lectura: «A Tour of Go»
Fuente(s):
El recurso denominado “[A Tour of Go]” es el tutorial oficial de Go. Allí podremos editar y ejecutar nuestros primeros ejemplos de programas escritos en Go.
Las siguientes secciones son un resumen de dicho tutorial.
Hello, 世界
- Aquí podremos conocer las características básicas del lenguaje, comenzando por el tradicional ejemplo de programa hello-world:
Paquetes (packages)
- Todo programa escrito en Go se compone de uno o más paquetes.
- Los programas comienzan su ejecución desde el paquete
main
. - Los programas declaran hacer uso de paquetes mediante la sentencia
import
. - Por convención, el nombre del paquete será el mismo del último de los elementos de la ruta de importación.
- El siguiente programa utiliza los paquetes
fmt
ymath/rand
:
1package main
2
3import (
4 "fmt"
5 "math/rand"
6)
7
8func main() {
9 fmt.Println("My favorite number is", rand.Intn(10))
10}
Importación (imports)
- En un programa Go, los paquetes que se desean importar pueden ser declarados mediante múltiples sentencias
import
separadas:
- Pero también pueden venir agrupados dentro de una única sentencia import, utilizando paréntesis:
- El método considerado como buen estilo es el segundo, y se le suele llamar sentencia de importación factorizada (factored import sentence).
Identificadores exportados (exported names)
-
En Go un nombre es exportado si éste comienza con una letra mayúscula; por ejemplo, tanto
Pi
comoPI
serán identificadores exportados. -
Al importar un paquete, sólo podemos hacer referencia a los identificadores exportados. Los nombres no exportados no son accesibles fuera de sus paquetes correspondientes.
Funciones (functions)
-
Una función puede tener cero o más parámetros.
-
En el siguiente ejemplo
add
tiene dos parámetros del tipo entero (int
), llamadosx
ey
.
- La declaración del tipo de dato, tanto de los parámetros como de la función, se realiza despúes de declarar el identificador.
Más información en: https://go.dev/blog/declaration-syntax
- Cuando dos o más parámetros consecutivos comparten el mismo tipo de dato, su pueden omitir las declaraciones de tipos de datos de todos excepto del último.
Resultados múltiples (multiple results)
-
Una función puede devolver cualquier número de resultados.
-
Por ejemplo, la función
swap
siguiente, devuelve dos cadenas de caracteres (strings):
- La declaración e inicialización simultánea de variables, puede ser acortada mediante el operador
:=
, así:
a, b := swap("hello", "world")
- Cuando los tipos de datos de las variables inicializadas pueden ser inferidos, no necesitan ser indicados explícitamente.
Resultados con nombre (named results)
- En Go los valores de retorno pueden venir identificados. Para ello, la declaración de la función correspondiente, debe incluir la declaración de los tipos y nombres de sus valores de retorno:
-
Los nombres de los resultados identificados se utilizan para asignar nombres con significado dentro del cuerpo de la función. Dichos nombres se utilizan para asignar los valores de retorno correspondientes.
-
Cuando una sentencia
return
no indica explícitamente sus argumentos, ésta utiliza los últimos valores asignados a los resultados identificados. Dichas sentencias se denominan “retornos desnudos (naked return)”. -
Es recomendable usar solo retornos desnudos cuando las funciones son cortas, para facilitar la lectura del código. Sobretodo porque la palabra reservada
return
siempre deberá estar presente en una declaración de función.
- Y por supuesto, cuando queremos asignar un valor a una variable o a un resultado con nombre, debemos utilizar el operador
=
.
Variables
-
Las sentencias
var
permiten declarar listas de variables. -
La sintaxis para dichas listas es similar a las de las declaraciones de los parámetros de las funciones, por lo que el nombre de su tipo de dato puede ir al final.
-
Una sentencia
var
puede estar a nivel de paquete o a nivel de función.
1package main
2
3import "fmt"
4
5var c, python, java bool
6
7func main() {
8 var i int
9 fmt.Println(c, python, java, i)
10}
- Las variables a nivel de función deben ser utilizadas, de lo contrario, el compilador mostrará un mensaje de error:
main.go:6: i declared and not used
Variables con inicializadores (Variables with initializers)
-
Las sentencias
var
pueden incluir un inicializador por variable. -
En el caso de que se incluya el inicializador, la declaración de los tipos de dato de las variables puede ser omitida.
1package main
2
3import "fmt"
4
5var i, j int = 1, 2
6
7func main() {
8 var c, python, java = true, false, "no!"
9 fmt.Println(i, j, c, python, java)
10}
- Cuando se declara una lista de variables, su lista de inicializadores asociada debe tener la misma longitud.