Go 语言中的函数是程序的基本构建块,它封装了代码逻辑并通过名称来调用。函数可以接收输入参数,执行操作,并返回输出。Go 语言的函数具有简洁而强大的特性,支持多值返回、命名返回值以及匿名函数等功能。


📖 目录

  1. 函数定义
  2. 函数参数
  3. 函数返回值
  4. 命名返回值
  5. 多个返回值
  6. 匿名函数
  7. 函数类型
  8. 参考资料

1. 函数定义

在 Go 语言中,函数的定义使用 func 关键字,后面跟着函数名称、参数列表、返回值类型和函数体。

1.1 基本语法

func 函数名(参数1 类型, 参数2 类型) 返回值类型 {
    // 函数体
}

示例:

package main

import "fmt"

func greet(name string) {
    fmt.Println("Hello,", name)
}

func main() {
    greet("Alice") // 调用 greet 函数
}

输出:

Hello, Alice


2. 函数参数

Go 语言函数的参数可以有多个,参数类型紧跟在参数名后。Go 支持按值传递和按引用传递参数,默认是按值传递。

2.1 单个参数

func add(a int) int {
    return a + 10
}

2.2 多个参数

func add(a int, b int) int {
    return a + b
}

2.3 参数类型简写

在多个参数类型相同的情况下,可以简化语法,合并类型定义。

func add(a, b int) int {
    return a + b
}


3. 函数返回值

Go 函数可以有返回值,也可以没有返回值。返回值类型在函数定义时指定,可以是单个值或多个值。

3.1 单个返回值

func multiply(a, b int) int {
    return a * b
}

3.2 多个返回值

Go 支持函数返回多个值,这使得错误处理更加简洁。

func divide(a, b int) (int, int) {
    if b == 0 {
        return 0, 0
    }
    return a / b, a % b
}

示例:

package main

import "fmt"

func divide(a, b int) (int, int) {
    if b == 0 {
        return 0, 0
    }
    return a / b, a % b
}

func main() {
    quotient, remainder := divide(10, 3)
    fmt.Println("Quotient:", quotient)
    fmt.Println("Remainder:", remainder)
}

输出:

Quotient: 3
Remainder: 1


4. 命名返回值

Go 语言允许在函数返回值中使用命名返回值(即提前声明返回变量)。这样在函数内部可以直接修改返回变量的值,返回时不需要再使用 return 显式返回。

示例:

package main

import "fmt"

func calculate(a, b int) (sum int, diff int) {
    sum = a + b
    diff = a - b
    return // 使用命名返回值
}

func main() {
    sum, diff := calculate(10, 5)
    fmt.Println("Sum:", sum)
    fmt.Println("Difference:", diff)
}

输出:

Sum: 15
Difference: 5


5. 多个返回值

Go 的函数支持多个返回值,在函数调用时可以直接捕获多个返回值。常见的用途包括错误处理(例如返回值中包含错误对象)。

示例:

package main

import (
    "fmt"
    "errors"
)

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 2)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }

    result, err = divide(10, 0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}

输出:

Result: 5
Error: division by zero


6. 匿名函数

匿名函数是没有名称的函数,可以在定义时立即调用。它们非常适用于短小的临时任务,尤其是在 Go 中经常与闭包一起使用。

示例:

package main

import "fmt"

func main() {
    // 定义匿名函数并立即调用
    func(a, b int) {
        fmt.Println("Sum:", a+b)
    }(3, 4)
}

输出:

Sum: 7

示例 2:匿名函数与闭包

package main

import "fmt"

func main() {
    add := func(a, b int) int {
        return a + b
    }
    fmt.Println(add(2, 3))
}

输出:

5


7. 函数类型

Go 允许定义函数类型,可以将函数作为参数传递,或者将其作为返回值。函数类型可以用于定义接口和更复杂的回调机制。

示例:

package main

import "fmt"

// 定义一个函数类型
type Operation func(int, int) int

func add(a, b int) int {
    return a + b
}

func subtract(a, b int) int {
    return a - b
}

func main() {
    var op Operation = add
    fmt.Println("Addition:", op(10, 5))

    op = subtract
    fmt.Println("Subtraction:", op(10, 5))
}

输出:

Addition: 15
Subtraction: 5


8. 参考资料


Go 语言的函数非常灵活且强大,通过支持多值返回、命名返回值、匿名函数等功能,使得函数在处理复杂任务时更加方便和简洁。掌握这些函数特性,将使得你在编写 Go 程序时更加得心应手。