116 lines
4.1 KiB
Markdown
116 lines
4.1 KiB
Markdown
这个问题问得非常棒 👏,因为理解 **Go 的内置函数(builtin functions)** 是掌握这门语言的关键之一。
|
||
|
||
在 Go 里,“函数”可以分为三大类:
|
||
|
||
1. ✅ **内置函数(built-in)** —— 不需要导包,直接用;
|
||
2. 📦 **标准库函数** —— 比如 `math.*`、`fmt.*` 等;
|
||
3. 🧑💻 **用户自定义函数** —— 你自己写的。
|
||
|
||
---
|
||
|
||
## 🧩 一、内置函数(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...)** | 简单打印调试(不建议用于正式输出) |
|
||
|
||
---
|
||
|
||
### 🔍 举例:
|
||
|
||
```go
|
||
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` |
|
||
|
||
这些都不是语言级内置的,但在日常开发中使用频率极高。
|
||
|
||
---
|
||
|
||
## 🧑💻 三、你自己写的函数
|
||
|
||
```go
|
||
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` 这些在底层是怎么运作的(内存分配、指针传递、是否返回新切片等)。
|