Golang的基本数据类型是构建复杂程序的基础,所有变量、常量的定义都依赖这些类型,不同类型的设计对应不同的内存分配和计算需求,合理选择类型能提升程序的性能和稳定性。

Golang基本数据类型分类
Golang的基本数据类型整体可以分为三大类,分别是数值类型、字符串类型和布尔类型,其中数值类型又进一步细分为整数类型、浮点数类型和复数类型。
1. 数值类型
整数类型
整数类型根据是否有符号和占用的内存大小分为多种,具体分类和特性如下:
| 类型名称 | 是否有符号 | 内存占用(字节) | 取值范围 |
|---|---|---|---|
| int8 | 是 | 1 | -128 ~ 127 |
| uint8 | 否 | 1 | 0 ~ 255 |
| int16 | 是 | 2 | -32768 ~ 32767 |
| uint16 | 否 | 2 | 0 ~ 65535 |
| int32 | 是 | 4 | -2147483648 ~ 2147483647 |
| uint32 | 否 | 4 | 0 ~ 4294967295 |
| int64 | 是 | 8 | -9223372036854775808 ~ 9223372036854775807 |
| uint64 | 否 | 8 | 0 ~ 18446744073709551615 |
| int | 是 | 32位系统4字节,64位系统8字节 | 对应系统的int32或int64取值范围 |
| uint | 否 | 32位系统4字节,64位系统8字节 | 对应系统的uint32或uint64取值范围 |
| byte | 否 | 1 | 0 ~ 255,是uint8的别名 |
| rune | 是 | 4 | -2147483648 ~ 2147483647,是int32的别名,用于表示Unicode码点 |
整数类型的使用示例:
package main
import "fmt"
func main() {
var a int8 = 100
var b uint8 = 200
var c byte = 'A' // byte类型存储字符的ASCII码
var d rune = '中' // rune类型存储中文的Unicode码
fmt.Println(a, b, c, d)
}
浮点数类型
浮点数类型用于表示带小数的数值,Golang支持两种浮点数类型:
float32:单精度浮点数,占用4字节,遵循IEEE 754标准,精度约为6-7位有效数字float64:双精度浮点数,占用8字节,遵循IEEE 754标准,精度约为15-16位有效数字,是浮点数的默认类型
浮点数类型使用示例:
package main
import "fmt"
func main() {
var f1 float32 = 3.1415
var f2 float64 = 3.141592653589793
fmt.Printf("float32 value: %v, type: %Tn", f1, f1)
fmt.Printf("float64 value: %v, type: %Tn", f2, f2)
}
复数类型
复数类型用于表示数学中的复数,包含实部和虚部,Golang支持两种复数类型:
complex64:实部和虚部都是float32类型,占用8字节complex128:实部和虚部都是float64类型,占用16字节,是复数的默认类型
复数类型使用示例:
package main
import "fmt"
func main() {
var c1 complex64 = 1 + 2i
var c2 complex128 = 3.14 + 5.27i
fmt.Printf("complex64 value: %v, type: %Tn", c1, c1)
fmt.Printf("complex128 value: %v, type: %Tn", c2, c2)
// 获取实部和虚部
fmt.Println("c1 real:", real(c1), "imag:", imag(c1))
}
2. 字符串类型
字符串类型string是Golang中常用的基本类型,用于表示一串字符序列,底层是不可变的字节数组。字符串的值需要用双引号包裹,支持转义字符,也可以直接用反引号定义原生字符串,原生字符串不会处理转义字符。
字符串类型使用示例:
package main
import "fmt"
func main() {
var s1 string = "hello golang"
var s2 string = "hellonworld" // 包含转义字符,换行
var s3 string = `hello
world` // 原生字符串,保留换行
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(s3)
// 字符串长度(字节数)
fmt.Println("s1 length:", len(s1))
}
3. 布尔类型
布尔类型bool只有两个取值:true和false,占用1字节内存,用于逻辑判断场景,不能和其他类型相互转换。
布尔类型使用示例:
package main
import "fmt"
func main() {
var b1 bool = true
var b2 bool = false
fmt.Printf("b1: %v, type: %Tn", b1, b1)
fmt.Printf("b2: %v, type: %Tn", b2, b2)
// 逻辑判断
if b1 && !b2 {
fmt.Println("逻辑判断成立")
}
}
数据类型使用注意事项
在使用Golang基本数据类型时,需要注意不同类型的变量之间不能直接赋值,尤其是不同长度的整数类型,需要显式转换。例如int8类型的变量不能直接赋值给int16类型的变量,需要通过类型转换实现。同时字符串是不可变的,不能直接修改字符串中的某个字符,如需修改可以先转换为字节切片或rune切片,修改后再转回字符串。
package main
import "fmt"
func main() {
var a int8 = 10
// 错误写法:var b int16 = a
var b int16 = int16(a) // 正确,显式类型转换
fmt.Println(b)
s := "hello"
// 错误写法:s[0] = 'H'
bs := []byte(s)
bs[0] = 'H'
s = string(bs)
fmt.Println(s) // 输出Hello
}