每日一Go-5、Go语言函数的使用

32 阅读2分钟

1、函数的定义

func 函数名(参数列表) (返回值列表) {
    // 函数体
}
  • 1.1 参数类型简写当多个相邻参数类型相同的时候,可以省略前面参数的类型,在最后一个参数后面加上类型即可,例如下面的两个函数是等价的
func add(a int, b int) int
func add(a,b int) int
  • 1.2 可变参数函数可以接受数量可变的参数,在参数类型前面加上“...”表示,例如
 func sum(nums ...int) int {
        total := 0
        for _, num := range nums {
            total += num
        }
        return total
    }
    sumResult := sum(1, 2, 3, 4, 5)
    fmt.Println("Sum:", sumResult)
    //输出
    //Sum: 15

2、多返回值函数

Go语言支持返回多个值,这是Go语言的特色

func change(a,b int) (int,int){
  return b,a
}

//返回值可命名,
//可以在函数体内直接使用,
//return语句可以省略返回值
func change2(a,b int) (c int,d int){
  c = b
  d= a
  return
}

Go语言鼓励显示的错误处理。标准做法是让函数返回一个结果和一个错误值(error类型)。如果函数执行成功错误值为nil,否则,错误值包含具体的错误信息。调用此类函数后,必须立即检查错误,这是一种良好的编程习惯。通常用 if err != nil 来判断。例如

package main
import (
    "errors"
    "fmt"
)
func divide(a, b float64) (float64, error) {
    if b == 0 {
        // 返回错误
        return 0, errors.New("除数不能为0") 
    }
    // 成功则错误为nil
    return a / b, nil 
}
func main() {
    //调用divide函数
    result, err := divide(10, 0)
    if err != nil {
        // 输出错误信息
        fmt.Println("错误:", err) 
    } else {
        // 输出结果
        fmt.Println("结果:", result)
    }
}
//输出
//错误: 除数不能为0

3、匿名函数

匿名函数没有名字,可以定义后立即执行,或者赋值给一个变量

package main
import (
    "fmt"
)
func main() {
    //定义后立即执行
    result := func(a, b int) int {
        return a + b
    }(3, 5) 
    fmt.Println("Result of anonymous function:", result)
    //将匿名函数赋值给变量
    sum := func(a, b int) int {
        return a + b
    }
    fmt.Println("Sum using variable function:", sum(10, 20))
}
//输出
//Result of anonymous function: 8
//Sum using variable function: 30

4、闭包

闭包是一个函数值,它引用了其函数体之外的变量。这个函数可以访问并赋予其引用的变量的值,换句话说,这个函数被“绑定”在了这些变量上。闭包的一个典型应用是创建状态保存器。

package main
import "fmt"
// newCounter 返回一个闭包函数
func newCounter() func() int {
    // 闭包外部的变量
    count := 0    
    // 返回的匿名函数就是一个闭包      
    return func() int { 
        // 闭包内部可以修改外部的count变量
        count++ 
        return count
    }
}
func main() {
    // 创建一个计数器实例
    counter := newCounter() 
    fmt.Println(counter())
    fmt.Println(counter())
    fmt.Println(counter())
    // 创建另一个独立的计数器
    anotherCounter := newCounter()
    fmt.Println(anotherCounter())
}
//输出
//1
//2
//3
//1

函数可以定义,但人生不能定义,只要保持一颗勇敢的心,就能一直发光