package main
import(
"fmt"
)
func squares() func() int{
var x int
return func() int{
x++
return x*x
}
}
func main(){
f := squares()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(squares()())
fmt.Println(squares()())
}
//output
/*
1
4
9
16
1
1
*/
函数squares返回一个另一个函数,调用squares创建一个局部变量x并返回一个匿名函数。
定义f为squares函数,调用f即调用squares函数,但x的值递增,说明x虽为局部变量,但还存在于f中,main看来x已经返回,但在f中x还未返回。
相反,调用squares()()则虽然类似于调用f,但不知道创建的这个squares()地址为多少,所以其中的x也不知道再如何调用,等于重新创建一个函数变量。
package main
import(
"fmt"
)
func Max(vals ...int) int{
temp := -1111111
for _, val := range vals{
if val > temp{
temp = val
}
}
return temp
}
func main(){
fmt.Println(Max(1,2,3,4,5,6,7))
fmt.Println(Max(1,2,3,4,5,6,75555))
fmt.Println(Max(1))
fmt.Println(Max())
}
变长函数,使用...,调用这个函数的时候可以传递该类型任意数目的参数。