【重学Golang 】—04函数

156 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

函数声明

func name(params) (result-list){
  //body( todo ...)
}

函数声明,使用关键字 func ,其包含以下内容:

  • 函数名
  • 形式参数列表 params ,用来定义函数的参数名以及参数类型,可以一个或多个
  • 返回值列表 result-list ,是函数返回值,返回值列表可省略,代表无返回值,同样也可以一个或多个
  • body 函数体,函数功能的具体逻辑
func sum(a int, b int) int {
  return a+b 
}

多返回值

在 go 中,一个函数可以返回多个值。许多标准库中,会有2个返回值,一个是期望的返回值,一个是错误时返回的错误信息。

result,err := func_doDeal()
​
func func_doDeal() (int,error){
  ....
  return 1,nil
}

一个函数内部可以将另一个有多返回值的函数调用作为返回值

func factoryDeal() (int,error) {
  ....
  
  return func_doDeal()
}

函数值

在 go 中,函数像其他值一样,拥有类型,可以被赋值,传递函数,从函数返回。即函数也是被看作第一类值

func square(n int) int { return n * n }
​
 f := square  // 函数赋值给 f
 fmt.Println(f(3)) // "9"

函数类型的零值是 nil 。调用值为 nil 的函数值会引起 panic 错误

var f func(int) int
f(3) /// 此处f的值为nil, 会引起panic错误// 函数值可以与nil比较
if f != nil {
  f(3)
}        

函数值可以与 nil 比较,但函数值之间不能比较。

匿名函数

匿名函数(内部函数)就是没有名字的函数。拥有函数名的函数只能在包级语法块中被声明,但是匿名函数可在任何地方内使用。

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

嵌套函数:函数内再定义一个匿名函数。在函数内定义的内部函数,可以使用外部函数的变量等,这种方式也称为闭包。

可变参数

参数数量可变的函数称为可变参数函数

func sum(vals... int) int {
    total := 0
    for _, val := range vals {
        total += val
    }
    return total
}
​
fmt.Println(sum())           // "0"
fmt.Println(sum(3))          // "3"
fmt.Println(sum(1, 2, 3, 4)) // "10"
​
values := []int{1, 2, 3, 4}
fmt.Println(sum(values...)) // "10"

Sum 函数返回任意个 int 型参数的和,vals 其实就是看作 类型为 []int 的切片。

但,可变参数函数和以切片作为参数的函数是不同的。

func f(...int) {}
func g([]int) {}
fmt.Printf("%T\n", f) // "func(...int)"
fmt.Printf("%T\n", g) // "func([]int)"