为什么Go类型的bool类型长16个字节?

问题描述

我正在阅读“ A Go of Go”教程,我对其中一个示例进行了一些修改,以发现Go中的bool大小为16个字节? 我是不是使用正确的函数来计算这个值,还是bool的大小实际上是16个字节?

    ID  Value1
0   3   9875
1   2   5631
2   1   1235
3   6   6614
4   5   97525
5   4   2683

输出

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",len(v))
    default:
        fmt.Printf("I don't kNow about type %T,but it's length is: %v bytes!\n",unsafe.Sizeof(v))
    }
}

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

解决方法

这16个字节是interface{}类型的大小。 v的类型为interface{},其实现方式类似于一对2指针(一个指向动态类型描述符,一个指向动态值)。您可以在此处了解有关接口“内部”的更多信息:Russ Cox: Go Data Structures: Interfaces

这是因为在default分支中没有“提取的”类型,在default的{​​{1}}分支中的类型与v的类型相同。 / p>

如果添加此内容:

i

这将输出(在Go Playground上尝试):

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

因此I don't know about type bool,but it's length is: 1 bytes! 类型的大小为1个字节。

还要注意,当您将bool用于复合类型(包括字符串,切片)时,它不包括元素所引用的内存。有关详细信息,请参见How to get memory size of variable in Go?