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)))
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容