本文不是一個詳細的教材,只是摘錄下我遇到的第一個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)))
}