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))
}
這里的函數(shù)接受了一個(gè)int參數(shù)蜕便,返回了一個(gè)匿名函數(shù)劫恒。在調(diào)用addn時(shí),返回了就是一個(gè)函數(shù)轿腺,需要再次傳參調(diào)用執(zhí)行两嘴。其結(jié)果為15
這里需要注意,在寫閉包函數(shù)時(shí)族壳,返回的匿名函數(shù)要跟外層的函數(shù)簽名保持一致憔辫。而且里面的參數(shù)發(fā)現(xiàn)了沒,里層函數(shù)的參數(shù)是可以調(diào)用外層的函數(shù)的參數(shù)的仿荆,有一種繼承的意思贰您。
利用閉包和匿名函數(shù),創(chuàng)造生成器的函數(shù)
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)
}
}