V
Vel·ToolKit
简洁 · 高效 · 即开即用
ZH
第 5 章 / 共 20 章

函数

多返回值、命名返回、变参、闭包

基本定义

package main

import "fmt"

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

func main() {
    fmt.Println(add(2, 3))
}

多返回值与命名返回

Go 鼓励多返回值,惯用 (result, error)。命名返回值可作为函数内的预声明变量,配合裸 return 使用。

package main

import (
    "errors"
    "fmt"
)

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

func main() {
    fmt.Println(divide(10, 4))
    fmt.Println(divide(1, 0))
}

变参函数

package main

import "fmt"

func sum(nums ...int) int {
    total := 0
    for _, n := range nums {
        total += n
    }
    return total
}

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

匿名函数与闭包

函数是一等公民,可赋值给变量、作为参数传递,并能捕获外部变量形成闭包。

package main

import "fmt"

func main() {
    counter := func() func() int {
        n := 0
        return func() int {
            n++
            return n
        }
    }()
    fmt.Println(counter(), counter(), counter()) // 1 2 3
}

函数作为参数 / 返回值

package main

import "fmt"

func apply(nums []int, f func(int) int) []int {
    out := make([]int, len(nums))
    for i, n := range nums {
        out[i] = f(n)
    }
    return out
}

func main() {
    double := apply([]int{1, 2, 3}, func(x int) int { return x * 2 })
    fmt.Println(double) // [2 4 6]
}