package main
import "fmt"
func addn(n int) func(int) int {
return func(m int) int {
return m + n
}
}
func main() {
//f := addn(10)(5)
f := addn(10)
fmt.Println(f(5))
}
这里的函数接受了一个int参数,返回了一个匿名函数。在调用addn时,返回了就是一个函数,需要再次传参调用执行。其结果为15
这里需要注意,在写闭包函数时,返回的匿名函数要跟外层的函数签名保持一致。而且里面的参数发现了没,里层函数的参数是可以调用外层的函数的参数的,有一种继承的意思。
利用闭包和匿名函数,创造生成器的函数
package main
import "fmt"
func iter(s []int) func() int {
var i = 0
return func() int {
if i >= len(s) {
return 0
}
n := s[i]
i += 1
return n
}
}
func main() {
f := iter([]int{1, 2, 3})
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
}
package main
import (
"fmt"
"errors"
)
func iter(s []int) func() (int, error) {
var i = 0
return func() (int, error) {
if i >= len(s) {
return 0, errors.New("end")
}
n := s[i]
i += 1
return n, nil
}
}
func main() {
f := iter([]int{1, 2, 3})
for {
n, err :=f()
if err != nil{
break
}
fmt.Println(n)
}
}