快速理解和记忆 Golang 数据类型
golang 数据类型概要
Go 语言的所有数据类型可以划分为值类型和值类型引用类型两大类。整体来说,Go 一共有 14 种数据类型,其中值类型 9 种,引用类型 5 种。数据类型的不同特征体现在内存管理、传值和并发操作里。
值类型和引用类型简述
-
值类型:该类型的变量直接存储数据本身。变量的值在赋值和传递时会进行复制,修改一个变量的值不会影响其他变量。
-
引用类型:该类型的变量存储的是数据的内存地址或引用。当变量的引用被复制时,数据本身不会被复制,多个变量可以指向同一块内存区域,修改其中一个变量的数据,会影响到所有指向该数据的变量。
类型分类 | 数据类型 | 数量 | 备注 |
---|---|---|---|
值类型 (Value Types) | bool | 1 | 布尔类型 |
int , int8 , int16 , int32 , int64 | 5 | 5种整数类型 | |
uint , uint8 , uint16 , uint32 , uint64 | 5 | 5种无符号整数类型 | |
float32 , float64 | 2 | 2种浮动类型 | |
complex64 , complex128 | 2 | 2种复数类型 | |
string | 1 | 字符串类型 | |
数组([n]T ) | 1 | 固定长度的数组 | |
结构体(struct ) | 1 | 自定义的数据类型 | |
指针(*T ) | 1 | 存储数据地址的指针 | |
引用类型 (Reference Types) | 切片([]T ) | 1 | 动态数组 |
映射(map[K]V ) | 1 | 键值对集合(哈希表) | |
通道(chan T ) | 1 | 用于并发通信的通道 | |
接口(interface ) | 1 | 定义行为的接口 | |
函数(func ) | 1 | 一等公民的函数类型 | |
合计 | 14 |
一、值类型
值类型是最基础的数据类型,变量存储的是数据的副本,而不是指向数据的引用。它们在赋值时会复制数据,因此变量之间是相互独立的。
1.1 基本类型
1.1.1 布尔类型 (bool
)
布尔类型只能取两个值:true
或 false
。它常用于条件判断和逻辑控制。
var isTrue bool = true
1.1.2 整数类型 (int
, int8
, int16
, int32
, int64
)
Go 中的整数类型分为有符号整数和无符号整数,int
是默认的整数类型,它根据平台(32位或64位)大小不同,通常为 32 位或 64 位。
int8
、int16
、int32
、int64
表示不同位数的有符号整数。uint8
、uint16
、uint32
、uint64
表示不同位数的无符号整数。
var x int = 42
var y int64 = 123456789012345
1.1.3 浮点类型 (float32
, float64
)
浮点数类型用于表示带有小数部分的数值。float32
和 float64
是标准的浮点数类型,float64
提供更高的精度。
var a float32 = 3.14
var b float64 = 2.718281828459045
1.1.4 复数类型 (complex64
, complex128
)
复数类型由实部和虚部组成,complex64
使用 float32
存储实部和虚部,complex128
使用 float64
存储。
var c complex64 = complex(1.5, 2.5)
var d complex128 = complex(3.0, 4.0)
1.1.5 字符串类型 (string
)
字符串是字符的序列,Go 中的字符串是不可变的(immutable),即一旦创建不能修改。
var str string = "Hello, Go!"
1.2 组合类型
1.2.1 数组 ([n]T
)
数组是固定长度的、相同类型的元素的集合。在 Go 中,数组的大小是其类型的一部分,所以数组的长度是类型的一部分。
var arr [3]int = [3]int{1, 2, 3}
1.2.2 结构体 (struct
)
结构体是用户自定义的数据类型,它将多个不同类型的变量组合在一起。
type Person struct {
Name string
Age int
}
var p Person = Person{Name: "Alice", Age: 30}
1.2.3 指针 (*T
)
指针类型存储的是另一个变量的地址。指针是值类型,但它指向的是引用类型。
var ptr *int
a := 58
ptr = &a // 获取变量a的地址
二、引用类型
引用类型的变量不存储数据本身,而是存储数据的引用(地址)。当变量被赋值或传递时,不会复制数据,而是复制引用,这意味着多个变量可以共享同一块内存区域。
2.1 切片 ([]T
)
切片是一个动态数组,大小可以随时变化。切片是 Go 中非常强大的数据结构,通常用于处理不确定大小的集合。
var s []int = []int{1, 2, 3}
2.2 映射 (map[K]V
)
映射是一种无序的键值对集合,类似于哈希表。它通过键值对存储数据,并通过键访问数据。
var m map[string]int = map[string]int{"apple": 5, "banana": 2}
2.3 通道 (chan T
)
通道是 Go 中用于并发编程的原语,它允许不同的 goroutine 之间通过发送和接收消息进行通信。
ch := make(chan int)
go func() {
ch <- 42 // 发送数据到通道
}()
val := <-ch // 从通道接收数据
2.4 接口 (interface{}
)
接口定义了方法集,是 Go 的核心特性之一。一个类型实现了某个接口的方法集,就自动实现了该接口。
var x interface{}
x = 42
x = "Hello"
2.5 函数 (func
)
函数在 Go 中也是一种类型,允许将函数作为参数传递,或者作为返回值返回。
var add func(int, int) int
add = func(a, b int) int { return a + b }
总结
Go 语言提供了丰富的内置数据类型,总共有 14 种类型,分别分为值类型和引用类型两大类:
- 值类型:布尔值、整数、浮点数、复数、字符串、数组、结构体和指针。
- 引用类型:切片、映射、通道、接口和函数。
值类型存储的是数据本身,赋值时会复制数据,彼此之间独立。引用类型存储的是数据的引用或地址,赋值时复制的是引用,多个变量可以共享同一块内存区域。