一、数值型
1. 整型
有符号和无符号的区别:无符号不包含负数
有符号
int int8 int16 int32 int64
无符号
uint uint8 uint16 uint32 uint64 uintptr
uintptr:位数不固定。为了在底层操作中 “承载指针地址” 而设计的特殊无符号整数,平时普通业务开发基本用不到
解释范围
有符号整数使用最高位作为符号位(0 表示正数,1 表示负数),剩余 n-1 位用于存储数值
以 int8(8 位有符号整数,n=8)为例:
- 符号位占 1 位,数值位占
8-1=7位 - 正数范围:
0到2^7 - 1 = 127 - 负数范围:
-2^7 = -128到-1
无符号整数没有符号位,所有 n 位都用于存储数值,因此最小值是 0(所有位全 0,8个0),最大值是 2^n - 1(所有位全 1)
以 uint8(8 位无符号整数,n=8)为例:
- 范围是
0到2^8 - 1 = 255
int 和 uint 的位数由操作系统的 “字长” 决定:
- 在 32 位操作系统中,
int和uint是 32 位(n=32),范围分别为[-2^31, 2^31-1]和[0, 2^32-1] - 在 64 位操作系统中,
int和uint是 64 位(n=64),范围分别为[-2^63, 2^63-1]和[0, 2^64-1]
2. 浮点型
包括float 32、float64
注意事项:
- 建议优先使用float64,float32精确度低:计算累计误差大;表示的整数范围有限
左移24位: 00000001 00000000 00000000 00000000
- 声明时可只写整数或小数部分,如
var e = .71828(等价于 0.71828)、var f = 1.(等价于 1) - 很小或很大的数建议用科学计数法,如
6.02214129e23(阿伏伽德罗常数)、6.62606957e-34(普朗克常数)
二、布尔型
true、false:不能参与任何计算和类型转换
三、字符型
byte
uint8 的别名,专门用于处理 ASCII 单字节字符(如英文字母、数字,范围 0-127)
rune
int32 的别名,用于处理 Unicode 多字节字符(如中文、emoji,覆盖全球绝大多数字符)
Unicode是ASCII的超集,,包含了后者所有字符。计算机逻辑上如何区分它们,并且区分多字节是一个字符/多个字符;物理实现上,有效利用空间:如果Unicode统一规定,单字符用四个字节表示,那么浪费了三个字节的存储空间。解决方式:UTF-8,实现unicode的物理存储(二进制),可变长的统一编码方式
编码规则:
-
单字节(ASCII 范围):字节第一位设为
0,后 7 位直接存储 Unicode 码(与 ASCII 码完全兼容)。例如英文字母'A',Unicode 码是U+0041,UTF-8 编码为01000001 -
多字节(
n ≥ 2字节):- 第 1 个字节:前
n位设为1,第n+1位设为0 - 后续字节:前两位一律设为
10 - 剩余位存储 Unicode 码的二进制值,从后向前填充,不足补
0
- 第 1 个字节:前
| Unicode 范围(十六进制) | UTF-8 编码格式(二进制) | 字节数 | 典型字符 |
|---|---|---|---|
0000 0000–0000 007F | 0xxxxxxx | 1 | 英文字母、数字 |
0000 0080–0000 07FF | 110xxxxx 10xxxxxx | 2 | 部分欧洲字符 |
0000 0800–0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 3 | 中文、日文等 |
0001 0000–0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 | 罕见字符、emoji |
四、字符串型
1. 定义
可以包含任意数据:通常是可读的文本
var mystr string = "go go go"
2. 特点
- 不可改变的字节序列,是utf-8字符的序列
- 底层支持utf-8编码、字符串占用字节灵活(节约空间,高效便捷)
3. 操作
五、类型转换
1. 目的
- 用于运算,如
int和float相加,需转换为同一类型 - 适配函数参数或返回值的类型要求,如函数要求
string类型,需将int转换为string
2. 注意事项
- 必须显式声明
- 类型转换需要正确定义符合规则
- 从取值范围小的类型转换到取值范围大的类型(如
int16转int32),这种转换不会丢失精度 - 只有底层类型一致的变量才能相互转换,不同底层类型(如
bool和int)转换会编译报错
- 从取值范围小的类型转换到取值范围大的类型(如
3. 修改字符串
并非改变底层字节序列,而是转换类型:当把字符串转换为 []byte(字节切片)或 []rune(符文切片)时,会创建一份副本。我们修改的是这个 “副本”,而非原字符串。修改完成后,再将副本转换回字符串,得到的是新的字符串