Go 语言(Golang)的数据类型可以分为以下几大类:
1. 基本类型(Basic types)
| 类型 | 说明 | 示例 |
|---|---|---|
| bool | 布尔型 | true / false |
| int, int8, int16, int32, int64 | 有符号整数 | int 是平台相关(32位系统32位,64位系统64位) |
| uint, uint8, uint16, uint32, uint64, uintptr | 无符号整数 | byte 是 uint8 的别名; rune 是 int32 的别名(表示一个 Unicode 码点) |
| float32, float64 | 浮点数 | |
| complex64, complex128 | 复数(实部和虚部分别是 float32/float64) | |
| string | 字符串(不可变、UTF-8 编码) | "hello 世界" |
2. 复合类型(Composite types)
| 类型 | 说明 |
|---|---|
| array | 固定长度的数组 [n]T |
| slice | 动态长度序列(切片,最常用) []T |
| map | 哈希表(字典) map[KeyType]ValueType |
| struct | 结构体,组合不同类型字段 |
| pointer | 指针 *T |
| function | 函数也是一种类型 func(params) returnType |
| interface | 接口类型 |
| channel | 通道,用于 goroutine 通信 chan T、<-chan T、chan<- T |
3. 具体常见别名总结
byte // uint8 的别名
rune // int32 的别名,表示一个 Unicode 码点
error // 内置接口类型:interface { Error() string }
4. 类型零值(Zero Value)一览(很重要!)
| 类型 | 零值 |
|---|---|
| bool | false |
| 所有数字类型 | 0 |
| string | ""(空字符串) |
| pointer | nil |
| slice | nil |
| map | nil |
| channel | nil |
| interface | nil |
| function | nil |
| struct/array | 所有字段/元素都是各自类型的零值 |
5. 类型转换(必须显式)
Go 不允许隐式类型转换,必须用 T(v) 显式转换:
var i int = 42 var f float64 = float64(i) // int → float64 var u uint = uint(f) i := 42 f := float64(i) s := string(i) // 注意:这里会转成字符码,不是"42"! s = strconv.Itoa(i) // 正确把 int 转成 "42"
总结一句话:Go 的类型系统是静态强类型,所有基本类型和复合类型都必须在编译期明确,不能隐式转换。
DeepSeek AI输出:Go有哪些数据类型?
Go 语言中的数据类型非常丰富,可以分为四大类:基本类型、复合类型、引用类型和接口类型。
下面我将为你详细列出并解释这些类型。
1. 基本类型
基本类型是构建更复杂数据结构的基石。
布尔类型
bool: 只有两个值,true或false。
数值类型
整数类型:
-
有符号整数(可正可负):
int8(-128 到 127)int16(-32768 到 32767)int32(-2147483648 到 2147483647)int64(非常大的正负整数)int(最常用,在32位系统上是int32,在64位系统上是int64)
-
无符号整数(只有正数和零):
uint8(0 到 255,也叫byte)uint16(0 到 65535)uint32(0 到 4294967295)uint64(非常大的正整数)uint(在32位系统上是uint32,在64位系统上是uint64)uintptr(用于存放一个指针,主要用于底层编程)
-
其他:
rune: 是int32的别名,代表一个 Unicode 码点。
浮点数类型:
float32(IEEE-754 32位浮点数)float64(IEEE-754 64位浮点数,精度更高,是最常用的)
复数类型:
complex64(实部和虚部都是float32)complex128(实部和虚部都是float64)
字符串类型
string: 一串不可变的字节序列,通常用于表示文本。使用双引号" "或反引号` `创建。
2. 复合类型 / 聚合类型
这些类型通过组合其他类型来创建更复杂的数据结构。
数组
- 具有固定长度且元素类型相同的序列。
- 例如:
var a [5]int声明了一个包含5个整数的数组。 - 长度是类型的一部分,
[5]int和[10]int是不同的类型。
切片
- 具有可变长度且元素类型相同的序列。这是 Go 中最常用、最灵活的序列类型。
- 它是对底层数组的一个“视图”或“引用”。
- 使用
make([]T, length, capacity)创建,或通过[]T{}字面量创建。 - 例如:
s := make([]int, 0, 5)或s := []int{1, 2, 3}。
结构体
- 一个可以包含不同数据类型的集合,用于将相关的数据聚合在一起。
- 使用
struct关键字定义。 - 例如:
type Person struct {
Name string
Age int
}
映射
- 一种无序的键值对集合。在其他语言中也被称为字典或哈希表。
- 使用
make(map[keyType]valueType)创建。 - 例如:
m := make(map[string]int)。
3. 引用类型
这些类型在声明时,变量本身存储的是一个“引用”(如指针、地址、句柄),而不是实际的数据。
- 切片
- 映射
- 通道
- 函数
- 指针
注意:切片、映射和通道在底层实现上都是包含指针的结构体,所以它们属于引用类型。当你将它们传递给函数时,传递的是这个引用(的副本),而不是整个数据的副本,因此在函数内部修改会影响到原始数据。
指针
- 存储了另一个变量的内存地址。
- 使用
*T表示指向类型T的指针。 - 使用
&操作符获取变量的地址。 - 例如:
var p *int = &x。
4. 接口类型
接口类型是一种抽象类型,它定义了一组方法签名(方法名、参数和返回值)的集合。
- 任何其他类型,只要实现了接口中定义的所有方法,就被认为是实现了该接口。
- 这是 Go 语言实现多态的核心。
- 例如:
// 定义一个接口
type Writer interface {
Write([]byte) (int, error)
}
// 任何拥有 `Write([]byte) (int, error)` 方法的类型都实现了 Writer 接口
总结表格
| 类别 | 类型 | 说明 |
|---|---|---|
| 基本类型 | bool |
布尔值 |
int, int8, int16, int32, int64 |
有符号整数 | |
uint, uint8, uint16, uint32, uint64, uintptr |
无符号整数 | |
float32, float64 |
浮点数 | |
complex64, complex128 |
复数 | |
string |
字符串 | |
byte (=uint8), rune (=int32) |
别名类型 | |
| 复合类型 | [n]T |
数组 |
[]T |
切片 | |
struct |
结构体 | |
map[K]V |
映射 | |
| 引用类型 | *T |
指针 |
slice, map, channel, function |
(底层包含指针) | |
| 接口类型 | interface |
接口 |