持续创作,加速成长!这是我参与「掘金日新计划 · 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)"