go functional programming 第一弹

本文不是一个详细的教材,只是摘录下我遇到的第一个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)))
}

你可能感兴趣的:(go functional programming 第一弹)