Go 语言函数式编程
在 Go 语言中函数是一等公民,它作为一个变量、类型、参数、返回值,甚至可以去实现一个接口,但是 Go 语言中函数不支持重载、嵌套和默认参数。
- 通过使用
func
关键字来定义函数
package main
func main(){
}
函数支持的特性
- 作为变量;
func test(){
// 函数体
}
funcTest := test
fmt.Println(funcTest())
- 匿名函数
test := func(){
// 函数体
}
- 作为类型;
package main
import "fmt"
type iAdder func(int, int) int
func main(){
var adder iAdder = func(a int, b int) int {
return a + b
}
fmt.Println(adder(1,2)) // 3
}
- 不定长度变参;
func test(num ...int){
fmt.Println(num) // [1 2 3 4]
}
test(1,2,3,4)
- 多返回值;
func test() (string,int,bool){
return "Hello World", 100, true
}
v1, v2, v3 := test()
fmt.Println(v1, v2, v3) // Hello World 100 true
- 命名返回值参数;
func test() (a string, b bool, c int) {
a = "Golang"
b = false
c = 200
return
}
v1, v2, v3 := test()
fmt.Println(v1, v2, v3) // Golang false 200
- 闭包
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
}
- 使用函数实现接口
还是以 斐波那契数列为例,将其当做一个文件流来读取.
package main
import (
"fmt"
"io"
"bufio"
"strings"
)
// 使用 闭包实现 斐波那契数列
func fibonacci() intGen {
a, b := 0, 1
return func() int {
a, b = b, a + b
return a
}
}
// 定义一个类型
type intGen func() int
// 实现一个 Reader 接口
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)
return strings.NewReader(s).Read(p)
}
// 使用 Reader 读取的方法
func printFileContents(reader io.Reader){
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
func main(){
f := fibonacci()
printFileContents(f)
}
有疑问加站长微信联系(非本文作者)