Dicen que si no es por la razón, es por la fuerza. Y durante mucho tiempo le hice el quite a Golang... hasta que llegó lo inevitable. Y aquí estamos, guardando apuntes de Go, que espero les sirvan de igual modo.
Diferencias entre =
y :=
El símbolo =
es la versión larga de declaración y asignación:
// Esto:
var number int
number = 657
// Es lo mismo que:
var number int = 657
// Y lo mismo que:
var number = 657
La versión corta del código anterior es:
number := 657
El código anterior está declarando, inicializando e infiriendo un tipo de dato, en este caso int
.
Reglas 🚓
No usar fuera de funcs
No se puede utilizar el símbolo :=
fuera de un método func
, ya que cualquier declaración debe comenzar con una palabra reservada (keyword)
// file: main.go
permitido := false // error!
// Anteponer 'var' lo convierte en una declaración permitida
var permitido = true
func aquiSePuede(){
sePuede := true
}
No usar dos veces seguidas
No se puede declarar una variable dos veces en el mismo ámbito (scope)
gemelos := 2
gemelos := 2 // error! no new variables on left side of :=
Esto no se puede, la primera instrucción declara la variable y la inicializa, no puedo volver a declararla como si no existiera.
Multi-variable y multi-declaración
Podemos declarar muchas variables y asignarles un valor en la misma sentencia.
AlturaPino, AlturaRoble, AlturaAcacia := 2.34, 3.24, 5.23
valorEUR, valorUSD, valorCLP := 780, 650, 1
Multi-declaración si una es nueva
Podemos utilizar el operador dos veces en multi-variables, sólo si una de ellas es nueva:
succ, err := funcion()
oper, err := funcion() // no falla, porque oper es nueva.
succ, res := funcion() // no falla, porque res es nueva.
Esto se puede porque no estás declarando ambas como nuevas variables en la segunda línea, sino que estás reasignando un valor a una variable e inicializando otra. En el ejemplo, en la segunda línea oper
se está inicializando, pero err
está cambiando su valor.
Se puede, pero no lo hagas
Puedes declarar una variable en un bloque nuevo incluso si ya fue declarada fuera de ese bloque.
var pleaseNo int = 23
func funcion(){
// aquí pleaseNo está dentro del scope de la función.
pleaseNo := 33
pleaseNo = 553
}
Lo mismo pasa con los scope en los if, for o switch:
pleaseNo := 42
if pleaseNo := funcion(); pleaseNo == 22 {
// pleaseNo tiene un valor de 22 aquí
}
// pero sigue teniendo un valor de 42 aquí
Enlaces