Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为什么bool类型的长度为16字节?_Go_Boolean_Size - Fatal编程技术网

Go 为什么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

我正在学习“围棋之旅”教程,我对其中一个例子做了一些修改,发现围棋中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个字节是
接口{}
类型的大小
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!