any
(interface{}
)的内存分配
any
(也就是 interface{}
)在 Go 中的内存分布,实际上包括两个指针字段,可以认为其定义如下:
1 | type emptyInterface struct { |
typ
是一个指向类型信息的指针,描述了存储值的类型。word
是一个指向实际数据的指针。
当一个 interface{}
类型的变量存储一个值时,Go 运行时会根据值的类型和大小来分配内存。具体来说:
- 小对象:如果存储的值是一个小对象(通常是指针大小或更小),数据可以直接存储在
word
字段中。 - 大对象:如果存储的值是一个大对象,数据会存储在堆上,
word
字段会指向这个堆上的数据。
在 64 位机器上,一个指针占 8 字节,所以一个 any 类型往往需要占 16 个字节。
type a = string
和 type a string
type a = string
语义是使用 a
作为 string
类型的别名,本质上二者是同一类型,因此所有需要 string
类型参数的地方,都可以用 a
类型的变量,反之亦然。
type a string
语义则是定义一个类型 a
,其底层类型是 string
。二者不能直接赋值使用,因为编译器将他们视为两种独立的类型。对于这两种类型的参数需要使用显式的类型转换来实现类型转换。比如需要 string
类型的地方可以对 a
类型的变量 aa 使用 string(aa)
来实现类型转换。