Estoy revisando el tutorial "A Tour of Go" y modifiqué un poco uno de los ejemplos para encontrar que el tamaño de bool en Go es de 16 bytes. ¿No estoy usando la función correcta para calcular esto o es realmente que el tamaño de bool es de 16 bytes?

package main

import "fmt"
import "unsafe"

func do(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("Twice %v is %v\n", v, v*2)
    case string:
        fmt.Printf("%q is %v bytes long\n", v, len(v))
    default:
        fmt.Printf("I don't know about type %T, but it's length is: %v bytes!\n", v, unsafe.Sizeof(v))
    }
}

func main() {
    do(21)
    do("hello")
    do(false)
}

Salida:

Twice 21 is 42
"hello" is 5 bytes long
I don't know about type bool, but it's length is: 16 bytes!
-2
Vallerious 1 sep. 2020 a las 12:53

1 respuesta

La mejor respuesta

Esos 16 bytes son el tamaño del tipo interface{}. v es de tipo interface{} que se implementa como un par de 2 punteros (uno al descriptor de tipo dinámico y otro al valor dinámico). Puede obtener más información sobre los "aspectos internos" de la interfaz aquí: Russ Cox: Go Data Structures: Interfaces

Esto se debe a que en la rama default no hay un tipo "extraído", en la rama default el tipo de rama de v es idéntico al tipo de i.

Si agrega esto:

b := false
fmt.Printf("I don't know about type %T, but it's length is: %v bytes!\n",
    b, unsafe.Sizeof(b))

Estos resultados (pruébelo en Go Playground):

I don't know about type bool, but it's length is: 1 bytes!

Entonces, el tamaño del tipo bool es de 1 byte.

También tenga cuidado cuando use unsafe.Sizeof() para tipos compuestos (cadenas, cortes incluidos), no incluye la memoria a la que hacen referencia los elementos. Para obtener más información, consulte Cómo obtener el tamaño de memoria de la variable en Go?

3
icza 1 sep. 2020 a las 11:14