Avatar ·

O que é null/nil em Go e como trabalhar com ele?

Olá a todos! Comecei a estudar Go e me deparei com o conceito de nil. Em outras linguagens (como Java ou JavaScript) existe null, que frequentemente causa erros (NullPointerException). Em Go, pelo que entendi, usa-se nil, mas o comportamento é diferente.

Aqui está o que tentei:

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
}

Perguntas:

  1. Por que nil em Go não leva à criação automática de estruturas vazias (ao contrário de null em algumas linguagens de programação)?
  2. Como verificar corretamente se é nil antes de usar ponteiros, slices, maps e outros tipos?