问题描述
我正在阅读“ 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?