El valor inicial nil
En la sección anterior, mencionamos que es un comportamiento erróneo asignar un elemento a un mapa nil
.
Aprovechemos esta oportunidad para explorar el verdadero significado de nil
en Go.
La esencia de nil
es un identificador pre-declarado.
Para los tipos de datos básicos, sus valores iniciales son diferentes:
- Valores booleanos
- Valores numéricos
- Cadenas de texto
Sin embargo, para slices, diccionarios, punteros, canales y funciones, su valor inicial es nil
. No es el valor predeterminado inicial con el que estamos familiarizados.
Esto se refleja en los objetos instanciados que se les asigna nil
. Aunque se pueden imprimir, no se pueden usar.
Además, hay algunos puntos a tener en cuenta sobre nil
.
Incomparabilidad de diferentes tipos de nil
package main
import "fmt"
func main() {
var m map[int]string
var p *int
fmt.Printf("%v", m == p)
}
La salida del programa es la siguiente:
invalid operation: m == p (mismatched types map[int]string and *int)
Es decir, no podemos comparar el nil
de un puntero de tipo int
con el nil
de un mapa.
No son comparables.
nil
no es una palabra clave
package main
import "fmt"
func main() {
var nilValue = "= =$"
fmt.Println(nilValue)
}
La salida del programa es la siguiente:
= =$
Podemos definir una variable llamada nil
y se puede compilar sin errores. Sin embargo, les recomendamos encarecidamente que no hagan esto en el desarrollo real.
Incomparabilidad de nil
package main
import "fmt"
func main() {
fmt.Println(nil == nil)
}
La salida del programa es la siguiente:
invalid operation: nil == nil (operator == not defined on nil)