菜单

内置函数与类型

相关源文件

本页面介绍了 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
float32IEEE 754 32 位浮点数4 字节-
float64IEEE 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 提供了一些类型别名,以方便和语义清晰。

别名等效类型目的
byteuint8用于字节级操作,并区分字节值和 8 位整数。
runeint32用于表示 Unicode 码点(字符)。
anyinterface{}表示任何类型(在 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

iota 是一个预声明的标识符,它在 const 声明中表示连续的整数常量。

iota 在每次出现 const 关键字时重置为 0,并在 const 块中的每个常量规范处递增 1。

nil

nil 是指针、通道、函数、接口、映射和切片的零值。它表示这些类型的缺失值。

nil - zero value for pointer, channel, func, interface, map, or slice types

请注意,nil 不能赋给 intstring 等其他类型的变量。

来源:src/builtin/builtin.go18-22 src/builtin/builtin.go106-113

内置函数

Go 提供了几个执行基本操作的内置函数。这些函数是预声明的,无需导入任何包即可使用。

集合操作

append

append 函数将元素添加到切片的末尾并返回更新后的切片。如果原始切片的容量不足,则会分配新的底层数组。

copy

copy 函数将元素从源切片复制到目标切片,并返回复制的元素数量(两个切片长度的最小值)。作为一种特殊情况,它还可以将字节从字符串复制到字节切片。

delete

delete 函数从映射中删除具有指定键的元素。如果映射为 nil 或键不存在,则不执行任何操作。

len

len 函数返回其参数的长度,该参数可以是字符串、数组、切片、映射或通道。对于字符串,它返回字节数。对于 nil 切片、映射或通道,它返回 0。

cap

cap 函数返回其参数的容量,该参数可以是数组、切片或通道。对于数组,它返回数组长度。对于切片,它返回切片可以达到的最大长度。对于通道,它返回通道缓冲区容量。

make

make 函数分配并初始化一个切片、映射或通道类型的对象。与 new 不同,它返回指定类型的已初始化(非零值)值。

clear

clear 函数清空映射(删除所有条目)和切片(将所有元素设置为其零值)。

来源:src/builtin/builtin.go137-251

内存分配

new

new 函数分配内存,将其设置为指定类型的零值,并返回指向它的指针。

来源:src/builtin/builtin.go223-226

复数操作

complex

complex 函数根据两个浮点值(实部和虚部)构造一个复数值。

real

real 函数返回复数的实部。

imag

imag 函数返回复数的虚部。

来源:src/builtin/builtin.go228-242

通道操作

close

close 函数关闭一个通道,该通道必须是双向的或仅发送的。它只能由发送方执行,绝不能由接收方执行。

来源:src/builtin/builtin.go253-262

错误处理和流程控制

panic

panic 函数会停止当前 goroutine 的正常执行。当一个函数调用 panic 时,正常执行会立即停止,所有延迟执行的函数都会运行,然后 panic 会沿着调用栈向上传播。

从 Go 1.21 开始,使用 nil 接口值或无类型 nil 调用 panic 会导致运行时错误(另一次 panic)。

recover

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

min 函数返回实现 cmp.Ordered 接口的固定数量参数中的最小值。

max

max 函数返回实现 cmp.Ordered 接口的固定数量参数中的最大值。

来源: src/builtin/builtin.go211-221

调试函数

print

print 函数以特定于实现的方式格式化其参数,并将结果写入标准错误。它主要用于调试。

println

println 函数与 print 类似,但会在参数之间添加空格,并在末尾追加换行符。

printprintln 都不保证会保留在语言中,并且不应在生产代码中使用。

来源: src/builtin/builtin.go293-304

类型转换和类型断言

Go 提供了在不同类型之间进行转换以及处理接口值的机制。

类型转换

Go 允许使用 T(v) 语法进行显式类型转换,其中 T 是目标类型,v 是要转换的值。只有当底层值可以在目标类型中表示时,才允许进行转换。

类型断言

对于接口值,Go 提供了类型断言来访问底层具体值。

类型开关

Go 还提供类型开关来处理多种可能的具体类型。

来源: doc/go_spec.html682-696

常见使用模式

错误处理

Go 的内置错误处理通常遵循此模式。

Defer-Panic-Recover 模式

内置函数 deferpanicrecover 可以组合使用以实现复杂的错误处理。

集合初始化

makenew 函数用于初始化不同的集合类型。

操作语法
创建切片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

限制和约束

虽然内置函数提供了强大的功能,但它们也有局限性。

  1. (Go 1.21 起) panic(nil) 被视为错误,并导致与预期行为不同的运行时 panic。
  2. printprintln 函数不保证会保留在语言中,仅应在调试时使用。
  3. 通道操作有特定规则(例如,关闭一个只读通道会导致编译错误)。
  4. 泛型函数(如 minmax)的类型约束要求参数实现特定的接口。

理解这些约束有助于编写更可靠、面向未来的 Go 代码。

来源: src/builtin/builtin.go276-278 src/builtin/builtin.go293-304 src/runtime/panicnil_test.go14-54