Skip to content
目录

函数详解 (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
1

3.2 常见坑:参数预计算

defer 函数的参数在声明时就会被计算并锁定,而不是在执行时。

go
func main() {
    i := 0
    defer fmt.Println(i) // 此时 i=0,参数被锁定
    i++
    fmt.Println("Main:", i)
}
// 输出:
// Main: 1
// 0

4. 特殊函数:init()

每个包可以包含一个或多个 init 函数,它们在 main 函数执行之前自动被调用,常用于初始化全局变量。

go
var db *Database

func init() {
    fmt.Println("数据库连接初始化...")
    db = connectDB()
}

func main() {
    // 此时 db 已经被初始化
}

执行顺序

  1. 导入包的 init()
  2. 当前包的常量/变量初始化
  3. 当前包的 init()
  4. main()

扫描下方二维码,私信【训练营】可进行咨询和报名。 微信公众号二维码

最后一次更新于:

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。

了解训练营详情