Go 函数

基本语法

func 函数名(参数列表) 返回值类型 {
    函数体
}

示例:

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

调用:

result := add(10, 20)
fmt.Println(result)

输出:

30

相同类型参数简写

多个参数类型相同时,可以只写一次类型:

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

等价于:

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

无参数无返回值

func hello() {
    fmt.Println("hello")
}

调用:

hello()

有参数无返回值

func printName(name string) {
    fmt.Println(name)
}

无参数有返回值

func getName() string {
    return "Tom"
}

调用:

name := getName()

多个返回值

Go 支持一个函数返回多个值。

func calc(a, b int) (int, int) {
    return a + b, a - b
}

调用:

sum, diff := calc(10, 5)

fmt.Println(sum)
fmt.Println(diff)

输出:

15
5

忽略返回值

使用 _ 忽略不需要的值。

sum, _ := calc(10, 5)

fmt.Println(sum)

命名返回值

返回值可以提前声明名称。

func calc(a, b int) (sum int, diff int) {
    sum = a + b
    diff = a - b
    return
}

等价于:

func calc(a, b int) (int, int) {
    return a + b, a - b
}

一般不建议滥用命名返回值,逻辑简单时使用即可。


error 返回值

Go 中最常见的多返回值场景:

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

    return a / b, nil
}

调用:

result, err := divide(10, 2)

if err != nil {
    fmt.Println(err)
    return
}

fmt.Println(result)

这是 Go 处理错误的标准模式。


可变参数

参数数量不固定时使用 ...

func sum(nums ...int) int {
    total := 0

    for _, num := range nums {
        total += num
    }

    return total
}

调用:

fmt.Println(sum(1, 2, 3))
fmt.Println(sum(1, 2, 3, 4, 5))

输出:

6
15

总结

函数定义

func 函数名(参数) 返回值 {
}

单返回值

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

多返回值

func calc(a, b int) (int, int) {
    return a + b, a - b
}

忽略返回值

sum, _ := calc(10, 5)

命名返回值

func calc(a, b int) (sum int, diff int) {
    return
}

Go 最常见写法

func xxx(...) (结果, error) {
    if 出错 {
        return ..., err
    }

    return ..., nil
}

Go 的多返回值设计主要就是为了优雅地返回业务结果和错误信息,因此 (value, error) 是实际开发中最常见的函数签名。

曼波