本文不是一个详细的教材,只是摘录下我遇到的第一个go写的functional 型的使用
先上下代码
package main
import "fmt"
//定义一个functional的type,类型的细节其实就是一个从int 计算返回bool的函数类型
type testInt func(int) bool
//定义一个isOdd的方法,它其实满足上述testInt的定义。
func isOdd(integer int) bool {
if integer%2 == 0 {
return false
}
return true
}
//同上,只是,这回是判断even
func isEven(integer int) bool {
if integer%2 == 0 {
return true
}
return false
}
//定义一个consumer函数,特点就是它的参数里有一个参数是函数类型的
func filter(slice []int, f func(int)bool) []int {
var result []int
for _, v := range slice {
if f(v) {
result = append(result, v)
}
}
return result
}
//定义一个consumer函数,特点就是它的参数里有一个参数是函数类型的
func filter2(slice []int, f testInt) []int {
var result []int
for _, v := range slice {
if f(v) {
result = append(result, v)
}
}
return result
}
//测试代码
func main() {
slice1 := []int{1, 2, 3, 4, 5, 6}
fmt.Println(filter(slice1, isOdd))
fmt.Println(slice1)
fmt.Println(filter2(slice1, isEven))
fmt.Println(slice1)
}
测试的结果如下:
[hunter] basics $: go run basictype.go
[1 3 5]
[1 2 3 4 5 6]
[2 4 6]
[1 2 3 4 5 6]
其中filter1和filter2的区别主要就是filter2使用了一个别名,通常我们在一些开源的项目中,经常也能看到类似的定义,用于简化书写或者定义一个更加通俗贴合业务的别名
这个简单的例子其实就是简单介绍了下,在golang里,也可行像js,或者scala这类语言,把函数作为参数或者返回值,完成函数编程,只是golang一切比较简化,没有像scala这类语言,内建了大量的map,filter,flatmap等高级操作。但是好处就是门槛很低,基本上手就能撸起来。
再来个强化点的,其实就是演示下把函数作为返回类型
package main
import "fmt"
func isOdd(integer int) bool {
if integer%2 == 0 {
return false
}
return true
}
func isEven(integer int) bool {
if integer%2 == 0 {
return true
}
return false
}
//主要改动,这个函数会返回一个类型为func(int)bool 的返回值
func getFilterLogic(even bool) func(int) bool {
if even {
return isEven
}
return isOdd
}
func filter(slice []int, f func(int) bool) []int {
var result []int
for _, v := range slice {
if f(v) {
result = append(result, v)
}
}
return result
}
func main() {
slice1 := []int{1, 2, 3, 4, 5, 6}
fmt.Println(filter(slice1, getFilterLogic(true)))
fmt.Println(filter(slice1, getFilterLogic(false)))
}