4.1 KiB
4.1 KiB
这个问题问得非常棒 👏,因为理解 Go 的内置函数(builtin functions) 是掌握这门语言的关键之一。
在 Go 里,“函数”可以分为三大类:
- ✅ 内置函数(built-in) —— 不需要导包,直接用;
- 📦 标准库函数 —— 比如
math.*、fmt.*等; - 🧑💻 用户自定义函数 —— 你自己写的。
🧩 一、内置函数(Built-in Functions)
这些是 Go 自带的核心函数,你可以在任何地方直接使用,不需要 import。
| 函数 | 功能 |
|---|---|
| append(slice, elems...) | 向切片末尾添加元素,返回新切片 |
| len(v) | 返回长度(适用于字符串、数组、切片、map、channel) |
| cap(v) | 返回容量(主要用于数组、切片、channel) |
| make(t, ...) | 创建切片、map 或 channel |
| new(T) | 分配类型 T 的零值内存,返回指针 *T |
| copy(dst, src) | 将 src 拷贝到 dst,返回复制的元素数 |
| delete(m, key) | 从 map 中删除指定 key |
| close(ch) | 关闭一个 channel |
| complex(r, i) | 构造复数(real + imag) |
| real(c) | 获取复数的实部 |
| imag(c) | 获取复数的虚部 |
| panic(v) | 触发运行时错误,立刻中止程序 |
| recover() | 从 panic 中恢复(常在 defer 中使用) |
| print(args...) / println(args...) | 简单打印调试(不建议用于正式输出) |
🔍 举例:
package main
import "fmt"
func main() {
// 1️⃣ append
a := []int{1, 2}
a = append(a, 3, 4)
fmt.Println(a) // [1 2 3 4]
// 2️⃣ len / cap
fmt.Println(len(a), cap(a)) // 4 4
// 3️⃣ make
m := make(map[string]int)
m["Alice"] = 10
// 4️⃣ delete
delete(m, "Alice")
// 5️⃣ new
p := new(int)
*p = 42
fmt.Println(*p) // 42
// 6️⃣ copy
b := make([]int, 2)
n := copy(b, a)
fmt.Println(b, n) // [1 2] 2
}
🧮 二、标准库函数(来自包)
这些需要 import,例如:
| 包 | 常用函数 |
|---|---|
fmt |
Println, Printf, Sprintf |
math |
Pow, Sqrt, Sin, Cos, Abs |
strings |
Split, Join, Contains, ToUpper |
strconv |
Itoa, Atoi, ParseFloat, FormatInt |
time |
Now, Sleep, Since |
sort |
Sort, Ints, Strings |
os |
Open, Create, ReadFile, WriteFile |
io |
Copy, ReadAll |
这些都不是语言级内置的,但在日常开发中使用频率极高。
🧑💻 三、你自己写的函数
func add(a, b int) int {
return a + b
}
func main() {
fmt.Println(add(3, 5)) // 8
}
🧠 小结对比:
| 类型 | 是否需 import | 示例 | 是否可重定义 |
|---|---|---|---|
| 内置函数 | ❌ | len, append, make |
❌ |
| 标准库函数 | ✅ | math.Pow, fmt.Println |
✅ |
| 自定义函数 | ✅ (你写的包) | add, calc |
✅ |
要不要我帮你整理一份「Go 内置函数的源码级行为图」?
能清晰看到 make、new、append 这些在底层是怎么运作的(内存分配、指针传递、是否返回新切片等)。