第五章-函数
实参是按值传递的,搜易函数收到的每个实参的副本。如果提供实参包含引用类型,比如指针、slice、map、函数或者通道,那么函当函数使用形参变量时就有可能会间接地修改实参变量。
Go可以使用递归。Go语言的实现使用了可变长的栈,栈的大小会随着使用而增长,可达到1GB左右的上限。这使我们可以安全地使用递归而不用担心溢出的问题。
多返回值,一个函数能够返回不止一个结果。
一个函数如果有命名的返回值,可以省略return的操作数,成为裸返回。
匿名函数:只能在包级别的作用于声明,但我们能够使用函数字面量在任何表达式内指定函数变量。func关键字后面没有函数的名称。
func squares()func()int{
var x int //x=0
return func()int{
x++
return x * x
}
}
func main(){
f := squares() //"1"
fmt.Printf(f()) //"4"
fmt.Printf(f()) //"9"
fmt.Printf(f()) //"16"
}
函数squares返回了另一个函数,类型是func()int。函数变量不仅是一段代码还可以拥有状态。里层的匿名函数能够获取和更新外层squares函数的局部变量。
变长函数被调用的时候可以有可变的参数个数。在参数列表最后的类型名称之前使用省略号“...”表示声明一个变长函数,调用这个函数的时候可以传递该类型任意数目的参数。
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类型的slice。调用sum的时候任何数量的参数都将提供给vals参数。
延迟函数:一个defer语句就是一个普通的函数后准方法调用。
defer详解链接:https://blog.csdn.net/Rage_/article/details/87936192