El valor cero cero en Golang

Jay Singh 20 junio 2023
  1. Compruebe el tamaño de nil con diferentes tipos en Golang
  2. Devolver cadena nil en Golang
El valor cero cero en Golang

nil es un valor cero en el lenguaje de programación Go, un identificador predefinido muy conocido y significativo. Es la representación literal de varios tipos diferentes de valores cero.

Muchos programadores novatos de Go que han trabajado en otros lenguajes populares pueden considerar nil como el equivalente de null (o NULL) en otros lenguajes. Esto es parcialmente correcto, pero hay varias distinciones entre nil en Go y null (o NULL) en otros idiomas.

Veremos algunos casos para ver qué significa nil en Golang.

Compruebe el tamaño de nil con diferentes tipos en Golang

Los diseños de memoria de todos los tipos de valores son siempre los mismos. Los valores nil del tipo no son excepciones (se asume el valor cero como nil).

El tamaño de un valor nil es siempre el mismo que el tamaño de los valores non-nil con el mismo tipo que el valor nil. Sin embargo, los valores nil de varios tipos pueden tener diferentes tamaños.

Código:

package main
import (
    "fmt"
    "unsafe"
)

func main() {
    var p *struct{} = nil
    fmt.Println(unsafe.Sizeof(p))

    var s []int = nil
    fmt.Println(unsafe.Sizeof(s))

    var m map[int]bool = nil
    fmt.Println(unsafe.Sizeof(m))

    var c chan string = nil
    fmt.Println(unsafe.Sizeof(c))

    var f func() = nil
    fmt.Println(unsafe.Sizeof(f))

    var i interface{} = nil
    fmt.Println(unsafe.Sizeof(i))
}

Producción :

8
24
8
8
8
16

Devolver cadena nil en Golang

El tipo de variable de puntero que se refiere a un valor de cadena es cadena. El valor cero de un puntero es nil.

Código:

package main
import (
    "fmt"
)

func main() {
    var data *string = nil
    if data == nil {
        fmt.Println(data)
    }
}

Producción :

<nil>

En el siguiente ejemplo, comprobaremos si nil == nil en Golang.

Código:

package main
import (
    "fmt"
)

func main() {
    var i *int = nil
    var j *int = nil
    if i == j {
        fmt.Println("equal")
    } else {
        fmt.Println("no")
    }
}

Producción :

equal