Go 为什么bool类型的长度为16字节?
我正在学习“围棋之旅”教程,我对其中一个例子做了一些修改,发现围棋中bool的大小是16字节?! 我是不是没有使用正确的函数来计算,还是bool的大小真的是16字节Go 为什么bool类型的长度为16字节?,go,boolean,size,Go,Boolean,Size,我正在学习“围棋之旅”教程,我对其中一个例子做了一些修改,发现围棋中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
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个字节是
接口{}
类型的大小v
属于interface{}
类型,它的实现类似于一对两个指针(一个指向动态类型描述符,一个指向动态值)。您可以在此处了解有关接口“内部”的更多信息:
这是因为在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))
这将输出(在上尝试):
所以bool
类型的大小是1字节
当您对复合类型(包括字符串、片)使用
unsafe.Sizeof()
时,也要小心,它不包括元素引用的内存。有关详细信息,请参见Wait.。我认为“I”是interface{}类型,而“v”是从中提取的值,对吗?@Vallerious是的,没错,但在default
分支中,它是interface{}
类型(更具体地说,它与I
的类型相同)。Go中的每个值都有一个在编译时定义的特定类型v
不能是“无论i
的值真正是什么类型”,它必须是定义良好的类型;在本例中,接口{}
。
I don't know about type bool, but it's length is: 1 bytes!