Avatar ·

¿Qué es null/nil en Go y cómo trabajar con él?

¡Hola a todos! Empecé a estudiar Go y me encontré con el concepto de nil. En otros lenguajes (por ejemplo, Java o JavaScript) existe null, que a menudo causa errores (NullPointerException). En Go, según tengo entendido, se usa nil, pero el comportamiento es diferente.

Esto es lo que probé:

package main

import "fmt"

func main() {
    var p *int
    fmt.Println(p) // imprime nil
    // fmt.Println(*p) // panic: runtime error: invalid memory address or nil pointer dereference
    
    var s []int
    fmt.Println(s == nil) // true
    fmt.Println(len(s))   // 0
    // s[0] = 1 // panic
    
    var m map[string]int
    fmt.Println(m == nil) // true
    // m["key"] = 1 // panic
}

Preguntas:

  1. ¿Por qué nil en Go no lleva a la creación automática de estructuras vacías (a diferencia de null en algunos lenguajes de programación)?
  2. ¿Cómo verificar correctamente si hay nil antes de usar punteros, slices, maps y otros tipos que pueden ser nil?