目录
函数详解 (Functions)
函数是 Go 程序执行的基本单元。Go 语言的函数具有“一等公民”的地位,支持多返回值、命名返回值、匿名函数和闭包等强大特性。
1. 函数定义
1.1 基本语法
go
// 语法:func 函数名(参数列表) (返回值列表) { ... }
func add(x int, y int) int {
return x + y
}1.2 参数简写
如果相邻参数的类型相同,可以省略前面的类型。
go
func sub(x, y int) int { // x 和 y 都是 int
return x - y
}1.3 多返回值
Go 语言的一大特色是支持多个返回值,常用于返回 (结果, 错误)。
go
func div(x, y int) (int, error) {
if y == 0 {
return 0, fmt.Errorf("除数不能为0")
}
return x / y, nil
}1.4 命名返回值
可以在定义函数时给返回值命名,它们在函数体内会被视为局部变量。
go
func calc(x, y int) (sum int, sub int) {
sum = x + y
sub = x - y
return // 裸返回 (naked return),会自动返回 sum 和 sub
}建议
在短小的函数中使用命名返回值可以增加可读性,但在长函数中应避免使用“裸返回”,因为它会降低代码的可读性。
2. 匿名函数与闭包
2.1 匿名函数
没有名字的函数,常用于回调或立即执行。
go
func main() {
// 立即执行函数
func(name string) {
fmt.Println("Hello", name)
}("World")
// 赋值给变量
add := func(x, y int) int {
return x + y
}
fmt.Println(add(1, 2))
}2.2 闭包 (Closure)
闭包是指函数引用了其外部作用域的变量。Go 的闭包会自动延长外部变量的生命周期。
go
func makeCounter() func() int {
i := 0
return func() int {
i++ // 引用了外部的 i
return i
}
}
func main() {
counter := makeCounter()
fmt.Println(counter()) // 1
fmt.Println(counter()) // 2
}3. 延迟执行 (defer)
defer 语句用于延迟调用指定的函数,通常用于资源释放(如关闭文件、解锁)。
3.1 基本规则
defer在函数返回前执行。- 多个
defer遵循后进先出 (LIFO) 原则(像栈一样)。
go
func main() {
fmt.Println("开始")
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
fmt.Println("结束")
}输出结果:
text
开始
结束
3
2
13.2 常见坑:参数预计算
defer 函数的参数在声明时就会被计算并锁定,而不是在执行时。
go
func main() {
i := 0
defer fmt.Println(i) // 此时 i=0,参数被锁定
i++
fmt.Println("Main:", i)
}
// 输出:
// Main: 1
// 04. 特殊函数:init()
每个包可以包含一个或多个 init 函数,它们在 main 函数执行之前自动被调用,常用于初始化全局变量。
go
var db *Database
func init() {
fmt.Println("数据库连接初始化...")
db = connectDB()
}
func main() {
// 此时 db 已经被初始化
}执行顺序:
- 导入包的
init() - 当前包的常量/变量初始化
- 当前包的
init() main()
扫描下方二维码,私信【训练营】可进行咨询和报名。 
