函数function
- Go 函数 不支持 嵌套、重载和默认参数,但支持以下特性:
无需声明原型、不定长度变参(…)、多返回值、命名返回值参数
匿名函数、闭包
函数可以没有参数或接受多个参数。
注意类型在变量名 之后。
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13)) //55
}
当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。
func add(x, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
不定长度变参
func main() {
A(1, 2, 3, 4, 5)
}
func A(a ...int) {
fmt.Println(a) //[1 2 3 4 5]
}
多返回值、命名返回值参数
func split(sum int) (x, y int) {
x = sum * 4 / 2
y = sum - x
return
}
func main() {
fmt.Println(split(17)) //34 -17
}
闭包
func main() {
f := closure(10)
fmt.Println(f(11)) //21
}
func closure(x int) func(int) int {
return func(y int) int {
return x + y
}
}
斐波纳契闭包
func fibonacci() func() int {
f0, f1, f2 := 0, 1, 0
index := 0
return func() int{
if index == 0 {
index += 1
return f0
} else if index == 1 {
index += 1
return f1
} else {
f2 = f0 + f1
f0 = f1
f1 = f2
return f2
}
}
}
func main() {
f := fibonacci()
for i := 0; i < 100; i++ {
fmt.Println(f())
}
}
demo
func main() {
var fs = [4]func(){}
for i := 0; i < 4; i++ {
defer fmt.Println("defer i = ", i)
defer func() {
fmt.Println("defer_closure i = ", i)
}()
fs[i] = func() {
fmt.Println("closure i = ", i)
}
}
for _, f := range fs {
f()
}
}
结果:
closure i = 4
closure i = 4
closure i = 4
closure i = 4
defer_closure i = 4
defer i = 3
defer_closure i = 4
defer i = 2
defer_closure i = 4
defer i = 1
defer_closure i = 4
defer i = 0