58 筆記go語言 函式式程式設計

2021-08-21 03:10:07 字數 3019 閱讀 6056

58.筆記go語言——函式式程式設計

58.筆記go語言——函式式程式設計

使用函式式程式設計使**更抽象和更容易理解

先看個例子如下:

packagemain

import(

"fmt" )

typestudentstruct

funcmain(),

&student,

&student,

&student,

} result1:=*student{}

for_,s:=rangestudents

} fmt.println("result1")

for_,s:=rangeresult1

result2:=*student{}

for_,s:=rangestudents

} fmt.println("result2")

for_,s:=rangeresult2 }

執行如下:

result1

alan

sandy

result2

jacky

alan

使用函式式程式設計來替換,先建立乙個filter函式如下:

func filter(l *student, f func(*student) bool) *student 

for _, s := range l  }

return result }

這是乙個通用的filter函式,傳入列表l和乙個函式f,對列表的每個成員呼叫傳入的函式,如果函式f返回true,就把成員新增到結果列表中。

函式式程式設計中,把函式作為引數(也就是「函式作為值」),就可以把列表的便利操作給抽象了。接下去你可以專注思考如何實現f這個函式。

作為乙個通用的filter函式,它的第二個引數f只能接收列表的成員(在這個例子中,型別是*student)這乙個引數,問題1裡面的另乙個引數「16」,怎麼傳給我們要實現的函式f,這就需要用到「閉包」,我們先來看實現**。

func agegreatthanfunc(age int) func(*student) bool  }

建立乙個函式agegreatthan,輸入引數是乙個希望和student物件去比較的年齡值,返回是乙個函式。這個函式可以用在filter中,所以返回的這個函式的輸入必須是*student,輸出必須是bool。這也是結果導向的思維方式。這個函式做的事情,就是拿student物件的年齡和age比較,對了,返回的那個函式可以訪問到傳入的age引數,所以閉包是用來解決變數的作用域的問題的。當你需要得到乙個函式,只接收乙個引數,而實際使用中需要多個引數的時候,就像上面這樣使用閉包,而引數減少的過程,稱為「currying」。

同樣道理,我們來實現問題2:獲得 age> 15 且 height > 170的student列表

func complexfunc(age int, height int) func(*student) bool  }

然後修改**如下:

packagemain
import(

"fmt"

)
typestudentstruct
funcfilter(

l*student,ffunc(*student)bool)*student

for_,s:=rangel

}

returnresult
}
funccomplexfunc(

ageint,heightint)func(*student)bool

}
funcagegreatthanfunc(

ageint)func(*student)bool

}
funcmain()

,

&student,

&student,

&student,

}

result1:=filter(students,agegreatthanfunc(16))

fmt.println("result1")

for_,s:=rangeresult1

result2:=filter(students,complexfunc(15,170))

fmt.println("result2")

for_,s:=rangeresult2
}
執行效果等同。

**中filter函式的第二個引數,是乙個函式。你還可以使用「map」模式使列印輸出**也「函式化」。

58.筆記go語言——函式式程式設計

34 筆記go語言 內建函式

34.筆記go語言 內建函式 預定義了少數函式,這意味著無需引用任何包就可以使用它們。close 用於channel通訊。使用它來關閉channel.delete 用於在map中刪除例項。len和cap 可用於不同的型別,len用於返回字串 slice和陣列的長度。new 用於各種型別的記憶體分配。...

55 筆記go語言 go型別

很多人喜歡go語言的原因是簡單。go語言的型別也是設計的如此簡單。go語言預設定義了一些型別如boolean,numeric和string.這些預定義的型別用於構建其他複雜的型別,例如array,struct,pointer,slice,map,channel等。型別可以有乙個名字也可以沒有名字。命...

10 筆記go語言 併發

10.筆記go語言 併發 goroutine 是由 go 執行時環境管理的輕量級執行緒。go f x,y,z 開啟乙個新的 goroutine 執行 f x,y,z f x y 和 z 是當前 goroutine中定義的,但是在新的 goroutine 中執行 f goroutine 在相同的位址空...