【go语言】函数

函数是组织好的、可重复使用的代码块。Go 语言中函数用 func 关键字声明,函数是「一等公民」,可以像普通值一样被赋值和传递。

1. 函数定义

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

例如定义一个求和函数:

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

result := sum(1, 2)
fmt.Println(result) // 3

参数类型相同的相邻参数可以合并声明,func sum(a, b int) int 与上面的写法等价。

2. 多返回值

Go 语言的函数可以返回多个值,这是它与很多语言不同的地方。惯用法是把错误作为最后一个返回值:

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("除数不能为0")
    }
    return a / b, nil
}

result, err := divide(10, 2)
if err != nil {
    fmt.Println("出错了:", err)
    return
}
fmt.Println(result) // 5

3. 可变参数

参数名后跟 … 表示可变参数,函数内部把它当作切片处理:

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

fmt.Println(sumAll(1, 2, 3))    // 6
fmt.Println(sumAll(1, 2, 3, 4)) // 10

// 已有切片时可以用 ... 展开
s := []int{5, 6}
fmt.Println(sumAll(s...)) // 11

可变参数必须是参数列表的最后一个。

4. 匿名函数与闭包

没有名字的函数叫匿名函数,可以在定义后立即执行,也可以赋值给变量:

// 定义后立即执行
func(x, y int) {
    fmt.Println(x + y)
}(1, 2)

// 赋值给变量
add := func(x, y int) int {
    return x + y
}
fmt.Println(add(3, 4)) // 7

匿名函数引用了外层函数的变量时,就形成了闭包。被引用的变量会一直存活到闭包不再被使用:

func counter() func() int {
    count := 0
    return func() int {
        count++
        return count
    }
}

c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2
fmt.Println(c()) // 3

每次调用 counter() 都会产生一个独立的 count 变量,闭包把状态保存在了函数里。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容