【Go语言基础【2】】数据类型之基础数据类型:数字、字符、布尔、枚举、自定义
文章目录
- 一、数据类型体系总览
- 二、整型(Integer Types)
- 三、浮点型(Floating-Point Types)
- 四、字符与字符串(Character & String)
- 1. 字符(`byte` & `rune` )
- 2. 字符串(`string` )
- 五、布尔类型(Boolean)
- 六、枚举类型(借助 `iota` 实现)
- 七、自定义类型(`type` 声明 )(用于基础类型封装)
一、数据类型体系总览
Go 语言的数据类型可分为基础类型与派生类型(如切片、映射、通道等),基础类型是构建程序数据的“原子单元”,涵盖:
- 整型
- 浮点型
- 复数型
- 字符与字符串
- 布尔类型
- 枚举(借助
iota
实现)- 自定义类型
二、整型(Integer Types)
- 用于存储整数,分有符号(
int
系列 )和无符号(uint
系列 ),按字节宽度细分,适配不同数值范围需求。 - 类型名、字节宽度、取值范围对应关系:
类型名 | 字节宽度 | 取值范围(有符号/无符号) | 说明 |
---|---|---|---|
int | 平台相关 | 32 位系统 4 字节(-2¹⁵ ~ 2¹⁵-1 );64 位系统 8 字节(-2³¹ ~ 2³¹-1 ) | 通用整型,适配平台,代码移植常用 |
uint | 平台相关 | 32 位系统 4 字节(0 ~ 2¹⁶-1 );64 位系统 8 字节(0 ~ 2³²-1 ) | 通用无符号整型 |
int8 | 1 字节 | -128 ~ 127(有符号) | 精准控制内存,适合小范围数值 |
int16 | 2 字节 | -32768 ~ 32767(有符号) | |
int32 | 4 字节 | -2147483648 ~ 2147483647(有符号) | 可存储 Unicode 码点(如 rune 底层类型 ) |
int64 | 8 字节 | -9223372036854775808 ~ 9223372036854775807(有符号) | 适合存储大整数(如时间戳、高精度计数 ) |
uint8 | 1 字节 | 0 ~ 255(无符号) | 别名 byte ,常用于处理二进制数据、字符 |
uint16 | 2 字节 | 0 ~ 65535(无符号) | |
uint32 | 4 字节 | 0 ~ 4294967295(无符号) | |
uint64 | 8 字节 | 0 ~ 18446744073709551615(无符号) | |
uintptr | 平台相关 | 32 位系统 4 字节;64 位系统 8 字节(无符号) | 存储指针地址,用于底层内存操作 |
示例代码
package mainimport "fmt"func main() {var numInt int = 100 // 通用有符号整型var numUint uint = 200 // 通用无符号整型var numInt8 int8 = -50 // 1字节有符号var numUint8 uint8 = 200 // 1字节无符号(别名 byte 场景:byte(numUint8) )fmt.Printf("int: %d, uint: %d, int8: %d, uint8: %d\n", numInt, numUint, numInt8, numUint8)
}
三、浮点型(Floating-Point Types)
- 存储小数,遵循 IEEE-754 标准,分
float32
(单精度 )、float64
(双精度 ),complex64
/complex128
用于复数(含实部、虚部 )。 - 类型名、字节宽度、含义对应:
类型名 | 字节宽度 | 含义 | 典型场景 |
---|---|---|---|
float32 | 4 字节 | IEEE-754 32 位单精度浮点数 | 对精度要求不高、内存敏感场景(如简单图形处理 ) |
float64 | 8 字节 | IEEE-754 64 位双精度浮点数 | 科学计算、金融等高精度需求场景 |
complex64 | 8 字节 | 32 位实部 + 32 位虚部的复数 | 信号处理、数学计算(如电路仿真 ) |
complex128 | 16 字节 | 64 位实部 + 64 位虚部的复数 | 高精度复数运算(如量子计算模拟 ) |
package mainimport "fmt"func main() {var f32 float32 = 3.1415926 // 单精度浮点var f64 float64 = 3.1415926535 // 双精度浮点var c64 complex64 = 1 + 2i // 复数(实部 int 自动转 float32 )var c128 complex128 = 3.14 + 6.28i fmt.Printf("float32: %.7f, float64: %.10f\n", f32, f64)fmt.Printf("complex64: %v, complex128: %v\n", c64, c128)
}
四、字符与字符串(Character & String)
1. 字符(byte
& rune
)
byte
:别名uint8
,1 字节,存储 ASCII 字符(如'a'
、'0'
),示例:var asciiChar byte = 'A' // 存储 ASCII 字符 'A' 的 ASCII 码值 65
rune
:别名int32
,4 字节,存储 Unicode 码点(涵盖全球语言字符、表情等 ),示例:var unicodeChar rune = '中' // 存储汉字“中”的 Unicode 码点
2. 字符串(string
)
- 核心特性:
- 只读的字节序列,基于 UTF-8 编码存储字符,可包含任意 Unicode 字符。
- 分可解析字符串(双引号
"
包裹,支持转义 )和原生字符串(反引号 ```包裹,保留换行、不转义 )。
- 转义字符:支持
\n
(换行 )、\t
(制表符 )、\u{...}
(Unicode 码点 )等,如:
var s1 string = "Hello\nWorld" // 可解析字符串,含换行转义var s2 string = `Line 1
Line 2` // 原生字符串,保留换行
- 常用操作:
- 获取长度:
len(s)
(按字节数,非字符数,因 UTF-8 可变长 )。 - 索引访问:
s[0]
(获取第 1 个字节,注意多字节字符需用rune
遍历 )。 - 拼接:
s := "Hello" + " World"
。
- 获取长度:
示例代码
package mainimport "fmt"func main() {var s string = "你好,Go!\u4e2d" // 含 Unicode 转义fmt.Println("字符串:", s)fmt.Println("长度(字节数):", len(s))// 遍历字符(按 rune 处理多字节字符)for _, r := range s {fmt.Printf("%c ", r)}
}
五、布尔类型(Boolean)
- 定义:类型为
bool
,值仅true
或false
,占 1 字节,零值是false
。 - 用途:条件判断(
if
、for
循环条件 )、逻辑运算(与&&
、或||
、非!
)。 - 示例:
package mainimport "fmt"func main() {var isTrue bool = truevar isFalse bool // 零值为 falsefmt.Printf("isTrue: %v, isFalse: %v\n", isTrue, isFalse)// 逻辑运算fmt.Println("与运算:", isTrue && isFalse)fmt.Println("或运算:", isTrue || isFalse)fmt.Println("非运算:", !isTrue) }
六、枚举类型(借助 iota
实现)
- 核心逻辑:
iota
是 Go 预定义常量生成器,在const
声明块中,从 0 开始逐行递增(每行常量声明自动+1
),用于批量定义有规律的常量。 - 基础用法:
package mainimport "fmt"const (a = iota // a = 0b // b = 1(自动继承 iota,且 iota 递增)c // c = 2d // d = 3 )func main() {fmt.Println(a, b, c, d) // 输出:0 1 2 3 }
- 进阶用法(结合位运算、跳过值等 ):
const (Read = 1 << iota // 1 << 0 = 1(二进制 0001 )Write // 1 << 1 = 2(二进制 0010 )Exec // 1 << 2 = 4(二进制 0100 )All = Read | Write | Exec // 7(二进制 0111 ) )
七、自定义类型(type
声明 )(用于基础类型封装)
- 语法:
type 新类型名 底层类型
,可基于基础类型或其他自定义类型创建新类型,用于类型封装、语义化标识。 - 作用:
- 增强代码可读性(如
type Gender string
明确语义 )。 - 实现类型方法(为自定义类型绑定专属行为 )。
- 增强代码可读性(如
- 示例:
package mainimport "fmt"// 自定义类型:基于 string 的 Gender 类型 type Gender stringconst (Male Gender = "male"Female Gender = "female" )// 为自定义类型绑定方法 func (g Gender) Info() string {return fmt.Sprintf("性别:%s", g) }func main() {var gender Gender = Malefmt.Println(gender.Info()) // 输出:性别:male }