函数
函数特点
无需声明原型。
支持不定 变参。
支持多返回值。
支持命名返回参数。
支持匿名函数和闭包。
函数也是一种类型,一个函数可以赋值给变量。
不支持 嵌套 (nested) 一个包不能有两个名字一样的函数。
不支持 重载 (overload)
不支持 默认参数 (default parameter)。
函数声明
func function_name(参数)(返回值){
//函数体
}
// 例子1
func get_sum(x, y int)(sum int){
sum := x + y
return sum
}
// 例子2 没有参数和返回值
func f1(){
fmt.Println("hello")
}
// 例子3 返回值是函数
func f2()(f func() int){
// 函数内只能是匿名函数
funcniming := func()(int){
return 12
}
retrun funcniming
}
- 一个或多个参数
func f(a string, y...int)(int){
fmt.Println(y) // [1,2,3,4], 接收的参数为slice类型
}
f("hello", 1, 2, 3, 4)
- 0个或多个参数
func myfunc(args ...int) { //0个或多个参数
}
匿名函数
- 匿名函数是指不需要定义函数名的一种函数实现方式。
- 匿名函数由一个不带函数名的函数声明和函数体组成。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
func main() {
getsum:= func(x, y int) int {
return x + y
}
fmt.Println(getsum(4, 2)) // 6
}
- 因函数不可以嵌套,所哟在函数对内部只能使用匿名函数。
闭包
- 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
package main
import (
"fmt"
)
func a() func() int {
i := 0
b := func() int {
i++
fmt.Println(i)
return i
}
return b
}
func main() {
c := a()
c()
c()
c()
a() //不会输出i
}
- 闭包复制的是原对象指针,这就很容易解释延迟引用现象。
递归
- 递归,就是在运行的过程中调用自己。 一个函数调用自己,就叫做递归函数。
1.子问题须与原始问题为同样的事,且更为简单。
2.不能无限制地调用本身,须有个出口,化简为非递归状况处理。