基本数据类型

211 阅读4分钟

一、数值型

1. 整型

有符号和无符号的区别:无符号不包含负数

有符号

int int8 int16 int32 int64

无符号

uint uint8 uint16 uint32 uint64 uintptr

uintptr:位数不固定。为了在底层操作中 “承载指针地址” 而设计的特殊无符号整数,平时普通业务开发基本用不到

image.png

解释范围

有符号整数使用最高位作为符号位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 32float64

注意事项:

  • 建议优先使用float64,float32精确度低:计算累计误差大;表示的整数范围有限

image.png

左移24位: 00000001 00000000 00000000 00000000

image.png

  • 声明时可只写整数或小数部分,如var e = .71828(等价于 0.71828)、var f = 1.(等价于 1)
  • 很小或很大的数建议用科学计数法,如6.02214129e23(阿伏伽德罗常数)、6.62606957e-34(普朗克常数)

image.png

二、布尔型

true、false:不能参与任何计算和类型转换

image.png

三、字符型

byte

uint8 的别名,专门用于处理 ASCII 单字节字符(如英文字母、数字,范围 0-127)

image.png

rune

int32 的别名,用于处理 Unicode 多字节字符(如中文、emoji,覆盖全球绝大多数字符)

image.png

UnicodeASCII的超集,,包含了后者所有字符。计算机逻辑上如何区分它们,并且区分多字节是一个字符/多个字符;物理实现上,有效利用空间:如果Unicode统一规定,单字符用四个字节表示,那么浪费了三个字节的存储空间。解决方式:UTF-8,实现unicode的物理存储(二进制),可变长的统一编码方式

编码规则:

  1. 单字节(ASCII 范围):字节第一位设为 0,后 7 位直接存储 Unicode 码(与 ASCII 码完全兼容)。例如英文字母 'A',Unicode 码是 U+0041,UTF-8 编码为 01000001

  2. 多字节(n ≥ 2 字节)

    • 第 1 个字节:前 n 位设为 1,第 n+1 位设为 0
    • 后续字节:前两位一律设为 10
    • 剩余位存储 Unicode 码的二进制值,从后向前填充,不足补 0
Unicode 范围(十六进制)UTF-8 编码格式(二进制)字节数典型字符
0000 0000–0000 007F0xxxxxxx1英文字母、数字
0000 0080–0000 07FF110xxxxx 10xxxxxx2部分欧洲字符
0000 0800–0000 FFFF1110xxxx 10xxxxxx 10xxxxxx3中文、日文等
0001 0000–0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx4罕见字符、emoji

四、字符串型

1. 定义

可以包含任意数据:通常是可读的文本

var mystr string = "go go go"

2. 特点

  • 不可改变的字节序列,是utf-8字符的序列
  • 底层支持utf-8编码、字符串占用字节灵活(节约空间,高效便捷)

3. 操作

image.png

image.png

五、类型转换

1. 目的

  • 用于运算,如 int 和 float 相加,需转换为同一类型
  • 适配函数参数或返回值的类型要求,如函数要求 string 类型,需将 int 转换为 string

2. 注意事项

  • 必须显式声明
  • 类型转换需要正确定义符合规则
    • 从取值范围小的类型转换到取值范围大的类型(如 int16 转 int32),这种转换不会丢失精度
    • 只有底层类型一致的变量才能相互转换,不同底层类型(如 bool 和 int)转换会编译报错

image.png

3. 修改字符串

并非改变底层字节序列,而是转换类型:当把字符串转换为 []byte(字节切片)或 []rune(符文切片)时,会创建一份副本。我们修改的是这个 “副本”,而非原字符串。修改完成后,再将副本转换回字符串,得到的是新的字符串

image.png