数据类型
数据类型
Go语言基本数据类型(Data-types)划分方式有很多,这里按照数据类型进行划分:值类型、复合类型、引用类型。
左耳朵耗子说:类型的本质是对内存的一种抽象,不同的类型会有不同的内存布局和内存分配的策略。不同的类型有不同的操作。
值类型
值类型即基本的数据类型,包括布尔类型(bool)、整型(int)、浮点型(float)、字节型(byte)、复数型(complex)、字符串型(string)和错误类型(error)。
提示
值类型的变量在传递过程中,编译器对该变量的值进行一次拷贝。
布尔型(Boolean)
关键字定义:bool
字节长度:1
取值范围:[true、false]
零值:false
警告
- 布尔类型不接受其他数据类型赋值;
- 布尔类型不能进行强制类型转换;
整型(Integer)
整型数据类型分为:有符号整型、无符号整型
类型 | 字节长度 | 取值范围 |
---|---|---|
int | 4/8 | 32位系统即int32,64位系统即int64 |
int8 | 1 | ~ |
int16 | 2 | ~ |
int32 | 4 | ~ |
int64 | 8 | ~ |
uint | 4/8 | 32位系统即uint32,64位系统即uint64 |
uint8 | 1 | 0~ |
uint16 | 2 | 0~ |
uint32 | 4 | 0~ |
uint64 | 8 | 0~ |
零值:对应字节长度的0
注意
- 由于字节范围的限制,尤其需注意“溢出”问题,可使用math包中“Max”和“Min”开头的常量帮组检查溢出;
整型数据的表示方法:
- 二进制,以
0b
或0B
开头的数是二进制,如0b1010
表示二进制数1010,即十进制的10; - 十进制,如、0、256;
- 八进制,以
0
、0o
、0O
开头的数是八进制,如0123
表示八进制数123,即十进制的83; - 十六进制,以
0x
、0X
开头的数是十六进制数,如0x123
表示十六进制数123,即十进制的291; - 指数形式,由数字和字母
e
或E
组成,如1e3
或10e2
代表十进制的1000,1e-3
代表1/1000,即0.001; - 十六进制浮点数,用以表式以2为底数的指数形式:,例如:
0x4p3
表示,结果是32;
Go1.13开始,下划线_可以出现在整数、浮点数和虚部数字面量中,以用做分段符以增强可读性。例如:6_9表示为69。
浮点型(Floating-point-number)
浮点型数据,也称为实数(Real-number),可存储带有小数的数值。浮点型数据在内存中的存储形式和整数不同,是按照指数形式存储的,共有三部分组成:符号、尾数和指数。
类型 | 字节长度 | 精确位数 |
---|---|---|
float32 | 4 | 精确小数点后7位 |
float64 | 8 | 精确小数点后15位 |
零值:0
浮点型数据的表示方法:
- 十进制小数形式:由数字和小数点组成,如1.57、0.12、0.0都是十进制的小数形式;
- 指数形式:由数字和字母组成,如或都表示;字母之前必须有数字且后面的指数必须为整数;
👣
- 浮点型数据是由有限的存数单元组成的,能提供有效数字总是有限的,有效位以外的数字将被舍去,可能存在一些误差;
复数(Complex-number)
复数是由两个浮点数构成,一个表示实部(real),一个表示虚部(imag),形式如的数,这里的、是实数,是虚数单位
类型 | 字节长度 | 说明 |
---|---|---|
complex64 | 8 | 由两个float32构成,因此字节长度为4+4 |
complex128 | 16 | 由两个float64构成,因此字节长度为8+8 |
对于一个复数,可以通过Go语言内置函数获得该复数的实部,也可以通过函数获得该复数的虚部;
零值:0+0i
字节型(Byte)
字节型数据在计算机中主要是来表示和存储ASCII码,即处理字符,将一个字符存放到一个字符变量中,实际上并不是把该字符本身存放到内存单元中,而是将该字符的ASCII编码存放到内存单元中。
关键字定义:byte
字节长度:1
取值范围:[0~],byte本质就是uint8。
零值:0
字符类型(Rune)
关键字定义:rune
Go语言处理Unicode字符有个专用的数据类型rune,等价于int32。
例如:'a'
、'中'
等
其中下面这些rune字面量形式的变种和'a'
是等价的。
'\141'
'\x61'
'\u0061'
'\U00000061'
注意
\
之后必须跟随三个八进制数字字符(0-7)表示一个byte值\x
之后必须跟随两个十六进制数字字符(0-9,a-f和A-F)表示一个byte值\u
之后必须跟随四个十六进制数字字符表示一个rune值(此rune值的高四位都为0)\U
之后必须跟随八个十六进制数字字符表示一个rune值。
这些八进制和十六进制的数字字符序列表示的整数必须是一个合法的Unicode码点值,否则编译将失败。
注
如果一个rune字面量中被单引号包起来的部分含有两个字符, 并且第一个字符是\,第二个字符不是x、 u和U,那么这两个字符将被转义为一个特殊字符。 目前支持的转义组合为:
\a
(rune值:0x07) 铃声字符\b
(rune值:0x08) 退格字符(backspace)\f
(rune值:0x0C) 换页符(form feed)\n
(rune值:0x0A) 换行符(line feed or newline)\r
(rune值:0x0D) 回车符(carriage return)\t
(rune值:0x09) 水平制表符(horizontal tab)\v
(rune值:0x0b) 竖直制表符(vertical tab)\\
(rune值:0x5c) 一个反斜杠(backslash)\'
(rune值:0x27) 一个单引号(single quote)
Unicode编码
随着计算机技术在世界范围内的广泛使用,国际标准化组织(ISO)统一制定了一种可以容纳世界上所有文字和符号的字符编码方案,即Unicode编码方案。由于涉及到不同计算机架构的大小端问题(Big Endian,Little Endian)于是存在不同的Unicode字符集转换格式(UCS Transformation Format,UTF),例如:
- UTF-8:使用1~4B不等长方案,西方字符通常只用一个字节,中文通常需要三个字节;
- UTF-16:用2B无符号整数存储Unicode字符;
- UTF-32:用4B无符号整数存储Unicode字符;
uintptr类型
Go语言中,uintptr是可以保存32位或64位的指针的无符号整数类型,和int类型一样,uintptr根据操作系统决定指针位数,32位操纵系统uintptr是32位的,64位操作系统uintptr是64位的。
复合类型
复合类型即比较复杂的数据类型,包括数组(array)、结构体(struct)。数组里存放的是一组相同类型的数据,结构体里存放的是不同类型的数据。
与值类型一致,复合类型变量在传递过程也是进行值拷贝。
引用类型
引用类型即指针类型,包括指针(pointer)、切片(silence)、字典(map)、通道(channel)、接口(interface)和函数(function)。
👀
值类型和引用类型的区别在于,在函数参数传递过程中
- 值类型的变量的值复制一份传递
- 引用类型的变量是把自己的内存地址传递,即拷贝地址