Go语言 unsafe.Sizeof(T)和reflect.TypeOf(T).Size()有什么区别

0g0grzrc  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(103)

我写了一个程序来检查unsafe.Sizeof()和reflect.TypeOf().Size()之间的区别
对于像int和float 64这样的数值类型,unsafe.Sizeof()显示16,而作为reflect.TypeOf().Size()显示8
当我检查go包的reflect引用时,它显示
// Size返回需要存储的字节数
//返回给定类型的值;它类似于不安全的。
如果是类似的,为什么两个方法返回不同的值呢?

func describe(i interface{}) {
    fmt.Printf("Type = %T, value = %v size = %d reflect.Size = %d \n", i, i, unsafe.Sizeof(i), reflect.TypeOf(i).Size())
}

func main() {
    s := "Hello World"
    describe(s)
    i := 55
    describe(i)
    k := 1.1
    describe(k)
    strt := struct {
        name string
    }{
        name: "John",
    }
    describe(strt)
}

字符串
产出

Type = string, value = Hello World size = 16 reflect.Size = 16 
Type = int, value = 55 size = 16 reflect.Size = 8 
Type = float64, value = 1.1 size = 16 reflect.Size = 8 
Type = struct { name string }, value = {John} size = 16 reflect.Size = 16

mi7gmzs6

mi7gmzs61#

unsafe.Sizeof(i)每次给你的都是interface{}的大小,而不是i的动态类型的大小。reflect.Typeof的目的是获取interface{}并查看其内部内容,因此它可以按照您的预期工作。
如果直接调用unsafe.Sizeof而不使用describe函数及其到interface{}的转换,则会看到不同的结果。

相关问题