Skip to content

1.8 函数 ​

函数定义与调用 ​

go
package main

import "fmt"

// 基本函数
func add(a int, b int) int {
    return a + b
}

// 简洁参数类型
func multiply(a, b int) int {
    return a * b
}

// 无返回值
func printSum(a, b int) {
    fmt.Println(a + b)
}

// 无参数
func sayHello() {
    fmt.Println("Hello!")
}

func main() {
    result := add(3, 5)
    fmt.Println(result)  // 8

    printSum(10, 20)
    sayHello()
}

多返回值 ​

go
package main

import (
    "errors"
    "fmt"
)

// 返回两个值
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("除数不能为 0")
    }
    return a / b, nil
}

// 命名返回值
func calculate(a, b int) (sum, product int) {
    sum = a + b
    product = a * b
    return  // 裸返回
}

func main() {
    // 接收所有返回值
    result, err := divide(10, 2)
    if err != nil {
        fmt.Println("错误:", err)
        return
    }

    // 忽略某个返回值
    val, _ := divide(10, 0)

    // 命名返回值
    s, p := calculate(3, 4)
    fmt.Println(s, p)
}

可变参数 ​

go
package main

import "fmt"

// 可变参数函数
func sum(nums ...int) int {
    total := 0
    for _, n := range nums {
        total += n
    }
    return total
}

func main() {
    fmt.Println(sum())              // 0
    fmt.Println(sum(1, 2, 3))       // 6
    fmt.Println(sum(1, 2, 3, 4, 5)) // 15

    // 切片展开
    nums := []int{1, 2, 3, 4}
    fmt.Println(sum(nums...))       // 10
}

匿名函数 ​

go
package main

import "fmt"

func main() {
    // 赋值给变量
    add := func(a, b int) int {
        return a + b
    }
    fmt.Println(add(3, 5))  // 8

    // 立即执行
    func() {
        fmt.Println("立即执行")
    }()

    // 作为函数参数
    numbers := []int{1, 2, 3}
    process(numbers, func(n int) int {
        return n * 2
    })

    // 作为返回值
    multiplier := makeMultiplier(3)
    fmt.Println(multiplier(5))  // 15
}

func process(nums []int, transform func(int) int) {
    for i, n := range nums {
        nums[i] = transform(n)
    }
}

func makeMultiplier(factor int) func(int) int {
    return func(n int) int {
        return n * factor
    }
}

闭包与作用域 ​

go
package main

import "fmt"

func main() {
    // 闭包基础
    counter := func() func() int {
        count := 0
        return func() int {
            count++
            return count
        }
    }()

    fmt.Println(counter())  // 1
    fmt.Println(counter())  // 2
    fmt.Println(counter())  // 3

    // 闭包捕获引用
    x := 10
    f := func() {
        fmt.Println(x)
    }
    x = 20
    f()  // 输出 20

    // 闭包陷阱
    // 错误示例
    var funcs []func()
    for i := 0; i < 3; i++ {
        funcs = append(funcs, func() {
            fmt.Println(i)  // 都输出 3
        })
    }

    // 正确示例
    var funcs2 []func()
    for i := 0; i < 3; i++ {
        i := i  // 创建新变量
        funcs2 = append(funcs2, func() {
            fmt.Println(i)  // 输出 0, 1, 2
        })
    }
}