funcadder()func(int)int{
sum :=0returnfunc(v int)int{
sum += v
return sum
}}funcmain(){
adder :=adder()for i :=0; i <10; i++{
fmt.Println(adder(i))}}
函數式編程 vs 函數指針
函數是一等公民:參數,變量,返回值都可以是函數
高階函數
函數 -> 閉包
“正統” 函數式編程
不可變性 : 不能有狀態, 只有常量和函數
函數只能有一個參數
go語言閉包的應用
例一 : 斐波那契數列
funcFibonacci()func()int{
a, b :=0,1returnfunc()int{
a, b = b, a+b
return a
}}
例二 : 爲函數實現接口
type intGen func()intfunc(g intGen)Read(
p []byte)(n int, err error){
next :=g()if next >10000{return0, io.EOF
}
s := fmt.Sprintf("%d\n", next)// TODO: incorrect if p is too small!return strings.NewReader(s).Read(p)}funcprintFileContents(reader io.Reader){
scanner := bufio.NewScanner(reader)for scanner.Scan(){
fmt.Println(scanner.Text())}}funcmain(){var f intGen = fib.Fibonacci()printFileContents(f)}