本文不是一個詳細(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)))
}