go functional programming 第一彈

本文不是一個詳細(xì)的教材,只是摘錄下我遇到的第一個go寫的functional 型的使用
先上下代碼

package main

import "fmt"

//定義一個functional的type,類型的細(xì)節(jié)其實就是一個從int 計算返回bool的函數(shù)類型
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函數(shù),特點就是它的參數(shù)里有一個參數(shù)是函數(shù)類型的
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函數(shù),特點就是它的參數(shù)里有一個參數(shù)是函數(shù)類型的
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)
}

測試的結(jié)果如下:

[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的區(qū)別主要就是filter2使用了一個別名,通常我們在一些開源的項目中,經(jīng)常也能看到類似的定義,用于簡化書寫或者定義一個更加通俗貼合業(yè)務(wù)的別名

這個簡單的例子其實就是簡單介紹了下,在golang里,也可行像js,或者scala這類語言,把函數(shù)作為參數(shù)或者返回值,完成函數(shù)編程,只是golang一切比較簡化,沒有像scala這類語言,內(nèi)建了大量的map,filter,flatmap等高級操作。但是好處就是門檻很低,基本上手就能擼起來。

再來個強化點的,其實就是演示下把函數(shù)作為返回類型

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
}

//主要改動,這個函數(shù)會返回一個類型為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)))
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容