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 在相同的位址空...