本页面介绍了 Go 语言的预声明标识符,包括内置类型、常量、变量和函数。这些元素是 Go 语言的基本构建块,无需任何导入即可在所有 Go 程序中使用。与常规包不同,内置标识符实际上并不包含在您可以导入的包中;相反,它们由 Go 编译器和运行时提供。
有关 Go 内存模型及其如何影响并发的信息,请参阅 内存模型。
Go 语言提供了一组预定义的类型、常量、变量和函数,这些函数无需显式导入即可供所有 Go 程序使用。这些内置函数构成了语言的基础,并支持内存分配、集合操作、错误处理等基本操作。
来源:src/builtin/builtin.go15-310
Go 的类型系统包含几种预定义的基元类型,无需导入任何包即可使用。
布尔类型 bool 表示具有两种可能状态的逻辑值。
bool - the set of boolean values, true and false
布尔变量的零值为 false。
Go 提供了全面的数值类型集,具有各种大小。
| 类型 | 描述 | 大小 | 范围 |
|---|---|---|---|
int8 | 有符号 8 位整数 | 1 字节 | -128 到 127 |
int16 | 有符号 16 位整数 | 2 字节 | -32768 到 32767 |
int32 | 有符号 32 位整数 | 4 字节 | -2147483648 到 2147483647 |
int64 | 有符号 64 位整数 | 8 字节 | -9223372036854775808 到 9223372036854775807 |
uint8 | 无符号 8 位整数 | 1 字节 | 0 到 255 |
uint16 | 无符号 16 位整数 | 2 字节 | 0 到 65535 |
uint32 | 无符号 32 位整数 | 4 字节 | 0 到 4294967295 |
uint64 | 无符号 64 位整数 | 8 字节 | 0 到 18446744073709551615 |
float32 | IEEE 754 32 位浮点数 | 4 字节 | - |
float64 | IEEE 754 64 位浮点数 | 8 字节 | - |
complex64 | 实部和虚部为 float32 的复数 | 8 字节 | - |
complex128 | 实部和虚部为 float64 的复数 | 16 字节 | - |
所有数值类型的零值为 0(对于复数类型为 0+0i)。
字符串类型表示一个字节序列。
string - the set of string values (immutable sequences of bytes)
Go 中的字符串是不可变的;一旦创建,其内容就不能更改。字符串变量的零值是空字符串("")。
来源:src/builtin/builtin.go15-73 doc/go_spec.html832-908
Go 提供了几种大小取决于目标架构的类型。
| 类型 | 描述 |
|---|---|
int | 有符号整数,至少 32 位,但平台相关(在 32 位系统上通常为 32 位,在 64 位系统上为 64 位) |
uint | 无符号整数,至少 32 位,但平台相关(通常与 int 的大小相同) |
uintptr | 足够大的无符号整数,可以存储指针值的未解释位。 |
当特定位大小对程序逻辑不关键,或者在与平台特定代码交互时,这些类型很有用。
来源:src/builtin/builtin.go75-85 doc/go_spec.html876-896
Go 提供了一些类型别名,以方便和语义清晰。
| 别名 | 等效类型 | 目的 |
|---|---|---|
byte | uint8 | 用于字节级操作,并区分字节值和 8 位整数。 |
rune | int32 | 用于表示 Unicode 码点(字符)。 |
any | interface{} | 表示任何类型(在 Go 1.18 中引入)。 |
这些别名提供了更具描述性的名称,指示类型的预期用途。
来源:src/builtin/builtin.go87-97 doc/go_spec.html887-891
Go 定义了一个内置的 error 接口,用于表示错误条件。
此接口在标准库和 Go 程序中用于错误处理。
可以通过 == 和 != 运算符进行比较的类型实现了 comparable 接口。
此接口只能用作类型参数约束,不能用作变量的类型。
来源:src/builtin/builtin.go99-104 src/builtin/builtin.go306-310
Go 定义了两个预声明的布尔常量。
true - the boolean true value
false - the boolean false value
这些是无类型布尔常量。
iota 是一个预声明的标识符,它在 const 声明中表示连续的整数常量。
iota 在每次出现 const 关键字时重置为 0,并在 const 块中的每个常量规范处递增 1。
nil 是指针、通道、函数、接口、映射和切片的零值。它表示这些类型的缺失值。
nil - zero value for pointer, channel, func, interface, map, or slice types
请注意,nil 不能赋给 int 或 string 等其他类型的变量。
来源:src/builtin/builtin.go18-22 src/builtin/builtin.go106-113
Go 提供了几个执行基本操作的内置函数。这些函数是预声明的,无需导入任何包即可使用。
append 函数将元素添加到切片的末尾并返回更新后的切片。如果原始切片的容量不足,则会分配新的底层数组。
copy 函数将元素从源切片复制到目标切片,并返回复制的元素数量(两个切片长度的最小值)。作为一种特殊情况,它还可以将字节从字符串复制到字节切片。
delete 函数从映射中删除具有指定键的元素。如果映射为 nil 或键不存在,则不执行任何操作。
len 函数返回其参数的长度,该参数可以是字符串、数组、切片、映射或通道。对于字符串,它返回字节数。对于 nil 切片、映射或通道,它返回 0。
cap 函数返回其参数的容量,该参数可以是数组、切片或通道。对于数组,它返回数组长度。对于切片,它返回切片可以达到的最大长度。对于通道,它返回通道缓冲区容量。
make 函数分配并初始化一个切片、映射或通道类型的对象。与 new 不同,它返回指定类型的已初始化(非零值)值。
clear 函数清空映射(删除所有条目)和切片(将所有元素设置为其零值)。
来源:src/builtin/builtin.go137-251
new 函数分配内存,将其设置为指定类型的零值,并返回指向它的指针。
来源:src/builtin/builtin.go223-226
complex 函数根据两个浮点值(实部和虚部)构造一个复数值。
real 函数返回复数的实部。
imag 函数返回复数的虚部。
来源:src/builtin/builtin.go228-242
close 函数关闭一个通道,该通道必须是双向的或仅发送的。它只能由发送方执行,绝不能由接收方执行。
来源:src/builtin/builtin.go253-262
panic 函数会停止当前 goroutine 的正常执行。当一个函数调用 panic 时,正常执行会立即停止,所有延迟执行的函数都会运行,然后 panic 会沿着调用栈向上传播。
从 Go 1.21 开始,使用 nil 接口值或无类型 nil 调用 panic 会导致运行时错误(另一次 panic)。
recover 函数允许程序管理 panic goroutine 的行为。如果在 panic 期间在延迟函数中调用,它会停止 panic 序列并返回传递给 panic 的值。如果在 panic 之外或不在延迟函数中调用,它将返回 nil。
来源:src/builtin/builtin.go265-291 src/runtime/panicnil_test.go1-54 test/fixedbugs/issue19658.go1-101
min 函数返回实现 cmp.Ordered 接口的固定数量参数中的最小值。
max 函数返回实现 cmp.Ordered 接口的固定数量参数中的最大值。
来源: src/builtin/builtin.go211-221
print 函数以特定于实现的方式格式化其参数,并将结果写入标准错误。它主要用于调试。
println 函数与 print 类似,但会在参数之间添加空格,并在末尾追加换行符。
print 和 println 都不保证会保留在语言中,并且不应在生产代码中使用。
来源: src/builtin/builtin.go293-304
Go 提供了在不同类型之间进行转换以及处理接口值的机制。
Go 允许使用 T(v) 语法进行显式类型转换,其中 T 是目标类型,v 是要转换的值。只有当底层值可以在目标类型中表示时,才允许进行转换。
对于接口值,Go 提供了类型断言来访问底层具体值。
Go 还提供类型开关来处理多种可能的具体类型。
Go 的内置错误处理通常遵循此模式。
内置函数 defer、panic 和 recover 可以组合使用以实现复杂的错误处理。
make 和 new 函数用于初始化不同的集合类型。
| 操作 | 语法 |
|---|---|
| 创建切片 | s := make([]int, 0, 10) 或 s := []int{} |
| 创建映射 | m := make(map[string]int) 或 m := map[string]int{} |
| 创建通道 | ch := make(chan int, 5) 或 ch := make(chan int) |
| 分配结构体 | p := new(Person) 或 p := &Person{} |
来源: src/builtin/builtin.go137-226
内置函数和类型在编译器和运行时级别实现。当您使用内置函数时,编译器通常会将其转换为特定的机器指令或对内部运行时函数的调用。
例如,当您使用 append 时,编译器会生成代码来处理底层的数组管理、重新分配和复制。同样,make 会转换为运行时中适当的内存分配和初始化调用。
这些内置函数提供了对基本操作的直接访问,否则这些操作需要开发者进行复杂且可能出错的实现。
来源: src/builtin/builtin.go5-10
虽然内置函数提供了强大的功能,但它们也有局限性。
panic(nil) 被视为错误,并导致与预期行为不同的运行时 panic。print 和 println 函数不保证会保留在语言中,仅应在调试时使用。min 和 max)的类型约束要求参数实现特定的接口。理解这些约束有助于编写更可靠、面向未来的 Go 代码。
来源: src/builtin/builtin.go276-278 src/builtin/builtin.go293-304 src/runtime/panicnil_test.go14-54
刷新此 Wiki
最后索引时间2025年4月17日(3cefe6)