- 深入浅出Go语言编程
- 阮正平 杜军
- 878字
- 2024-08-15 17:01:07
3.3.1 类型的两个要素
类型是变量的根本,类型为我们提供了两个要素。第一个是大小,表示占用多大内存,或者说,读取和写入这种类型时需要操作的字节数是多少。第二个是表示方法,即告诉内存如何表示此变量。没有这两个要素,我们就无法知道变量的含义。
下面以数据类型float64为例来分析。首先是大小,其中64表示类型的大小是8(由64/8得到)字节,内存的相应开销为64个二进制位(64位)。其次是表示方法,float用于告诉使用者,这是以IEEE754格式表示的浮点小数(IEEE 754是20世纪80年代以来广泛使用的浮点数运算标准,许多CPU与浮点运算器均采用该标准)。可见,float64这种写法同时满足了两个关于类型的关键要素。
我们知道,int是一种整型,下面来看看明确了字节长度的整型,如int8占用1字节,int16占用2字节,int32占用4字节,int64占用8字节。可以使用“unsafe.Sizeof(数据类型)”查看对应数据类型占用的字节数,示例如下。
func main() {
var flag bool
var n int
var counter int32
var name string
fmt.Printf("bool占用位为:%v\n", unsafe.Sizeof(flag))
fmt.Printf("int占用字节大小为:%v\n", unsafe.Sizeof(n))
fmt.Printf("counter占用字节大小为:%v\n", unsafe.Sizeof(counter))
fmt.Printf("string占用字节大小为:%v\n", unsafe.Sizeof(name))
}
//输出
bool占用字节大小为1
int占用字节大小为4
counter占用字节大小为4
string占用字节大小为16
我们常说的64位处理器,意味着它所使用的是64位的架构。从Go语言的设计角度来看,指针的大小和内存地址的大小都是64位(或8字节),这里的64位我们称为字长。
字长是与具体架构相对应的单位。既然内存地址和字长都是64位(或8字节),于是也把一般的整型的长度定为了8字节。所以,默认的int类型就占64位(8字节)。这样一来,内存地址、字长与int的大小就统一了。
默认的int类型的长度是与处理器架构有关的。在使用整型时,尽量使用默认大小的int,建议少使用在int后面写出位数的整型(如int8、int64等),除非遇到了不得不这么做的情况(比如使用atom包时要求有精确的长度)。
布尔类型比较特殊,虽然它只占用了1比特位,但因为存在内存对齐问题(1字节是8比特位),所以它会填满剩下的7位凑成1字节。字符串类型占用的字节大小为16字节,原因是底层数据结构由指向字符串起始地址的指针和字符串的长度构成,这两个成员分别占用了8字节。要说明的是,这里说的是字符串描述符的大小,而不是字符串本身的内存长度。