You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中unsafe.Sizeof与reflect.TypeOf().Size()的差异原因探究

为什么unsafe.Sizeof()与reflect.TypeOf().Size()对数值类型返回不同值?

你遇到的差异核心原因是两者测量的对象完全不同:

  • unsafe.Sizeof(i) 测量的是参数 i 本身的大小,而 i 是一个interface{}(空接口)类型的变量。在64位系统中,空接口的大小固定为16字节——它由两个8字节的指针组成:一个指向类型信息,另一个指向实际存储的数据。
  • reflect.TypeOf(i).Size() 测量的是空接口i底层包裹的具体值的类型大小,比如int、float64这些基础数值类型在64位系统中本身大小就是8字节。

结合你的测试代码和输出分析:

  1. 对于string和自定义结构体:它们本身的大小就是16字节(string由指向字节数组的指针和长度组成;结构体包含一个string字段,总大小也是16),所以unsafe.Sizeof(i)(空接口大小)和reflect.TypeOf(i).Size()(实际类型大小)结果一致。
  2. 对于int、float64:这些类型本身大小是8字节,但它们被包裹在空接口i中,所以unsafe.Sizeof(i)返回空接口的16字节,而reflect.TypeOf(i).Size()返回实际类型的8字节。

如果要让unsafe.Sizeof()直接测量具体类型的大小,可以直接作用于原始变量,比如:

fmt.Println(unsafe.Sizeof(55))    // 输出8
fmt.Println(unsafe.Sizeof(1.1))   // 输出8

这时候结果就会和reflect.TypeOf().Size()完全一致。

内容的提问来源于stack exchange,提问作者noob-Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:22:40