我写了一个程序来检查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
型
1条答案
按热度按时间mi7gmzs61#
unsafe.Sizeof(i)
每次给你的都是interface{}
的大小,而不是i
的动态类型的大小。reflect.Typeof
的目的是获取interface{}
并查看其内部内容,因此它可以按照您的预期工作。如果直接调用
unsafe.Sizeof
而不使用describe
函数及其到interface{}
的转换,则会看到不同的结果。