gpt4 book ai didi

go - 为什么 Go 中的 bool 类型是 16 字节长?

转载 作者:行者123 更新时间:2023-12-01 22:38:34 26 4
gpt4 key购买 nike

我正在阅读“A Tour of Go”教程,我稍微修改了一个示例,发现 Go 中 bool 的大小是 16 字节?!
我没有使用正确的函数来计算这个,还是 bool 的大小真的是 16 字节?

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)
}
输出:
Twice 21 is 42
"hello" is 5 bytes long
I don't know about type bool, but it's length is: 16 bytes!

最佳答案

这 16 个字节是 interface{} 的大小。类型。 vinterface{} 类型它的实现类似于一对 2 指针(一个指向动态类型描述符,一个指向动态值)。您可以在此处了解有关“内部”接口(interface)的更多信息:Russ Cox: Go Data Structures: Interfaces
这是因为在 default分支中没有“提取”类型,在 default v 的分支类型与 i 的类型相同.
如果你添加这个:

b := false
fmt.Printf("I don't know about type %T, but it's length is: %v bytes!\n",
b, unsafe.Sizeof(b))
此输出(在 Go Playground 上尝试):
I don't know about type bool, but it's length is: 1 bytes!
所以 bool的大小类型为 1 个字节。
使用 unsafe.Sizeof() 时也要小心对于复合类型(包括字符串、 slice ),它不包括元素引用的内存。详情见 How to get memory size of variable in Go?

关于go - 为什么 Go 中的 bool 类型是 16 字节长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63685374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com