跟着google工程师学Go语言(十六):Golang函数式编程
程序员文章站
2022-03-15 15:14:49
...
欢迎来到:Google资深工程师深度讲解Go语言
视频地址:Google资深工程师深度讲解Go语言 -函数式编程
函数式编程 & 函数指针
函数是一等公民:参数,变量,返回值都可以是函数
高阶函数
函数--> 闭包
示例:adder.go
package main
import "fmt"
func adder()func(int) int { //闭包
sum := 0
return func(v int) int {
sum += v
return sum
}
}
func main() {
a := adder()
for i:= 0;i < 10; i++{
fmt.Printf("0 + 1 + 2 + ... + %d = %d \n",i,a(i))
}
}
闭包图示
go语言闭包的应用
实例一:斐波那契数列
package main
import "fmt"
func fibonacci()func() int {
a, b := 0, 1
return func() int {
a, b = b, a + b
return a
}
}
func main() {
f := fibonacci()
fmt.Println(f()) //1
fmt.Println(f()) //1
fmt.Println(f()) //2
fmt.Println(f()) //3
fmt.Println(f()) //5
fmt.Println(f()) //8
fmt.Println(f()) //13
fmt.Println(f()) //21
}
实例二:为函数实现接口
package main
import (
"bufio"
"fmt"
"io"
"strings"
)
func fibonacci() intGen {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a
}
}
type intGen func() int
func (g intGen) Read(p []byte) (n int, err error) {
next := g()
if next > 10000 {
return 0, io.EOF
}
s := fmt.Sprintf("%d\n", next)
//TODO:如果p太小,则需要实现缓存
return strings.NewReader(s).Read(p)
}
func printFileContents(reader io.Reader) {
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
func main() {
f := fibonacci()
printFileContents(f)
//fmt.Println(f()) //1
//fmt.Println(f()) //1
//fmt.Println(f()) //2
//fmt.Println(f()) //3
//fmt.Println(f()) //5
//fmt.Println(f()) //8
//fmt.Println(f()) //13
//fmt.Println(f()) //21
}
Go参考资料:Go入门指南-闭包
上一篇: 再巩固两个疗程