登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-02-15 08:27:24 173浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《unsafe.Sizeof(T) 和reflect.TypeOf(T).Size() 有什么区别》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我编写了一个程序来检查 unsafe.sizeof() 和 reflect.typeof().size() 之间的差异

对于 int 和 float64 等数字类型,unsafe.sizeof() 显示 16,而reflect.typeof().size() 显示 8

当我检查反射的 go 包参考时,它显示了

//size返回需要存储的字节数

// 给定类型的值;它类似于 unsafe.sizeof。

如果相似,为什么两种方法返回不同的值?

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

正确答案


unsafe.Sizeof(i) 每次都会为您提供 interface{} 的大小,而不是 i 动态类型的大小。 reflect.Typeof 意味着采用 interface{} 并查看其内部内容,因此它可以按您的预期工作。

如果您直接调用 unsafe.Sizeof,而不使用 describe 函数及其到 interface{} 的转换,您将看到不同的结果。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>