Golang學習筆記(十一)函式變數,將函式作為值使用
阿新 • • 發佈:2018-12-04
Golang中,函式也可以作為一個變數來使用。
寫一個普通函式來讓一段字串,實現大小寫交替顯示:
func processCase1(str string) string {
result := ""
for i, value := range str {
if i%2 == 0 {
result += strings.ToUpper(string(value))
} else {
result += strings.ToLower(string(value))
}
}
return result
}
再寫一個將函式作為變數的函式:
func stringToCase1(str string, myfunc func(string) string) string { return myfunc(str) }
這時在main()裡執行stringToCase1()函式,並將上面processcase1()函式作為引數變數使用:
fmt.Println(stringToCase1(str, processCase1))
進一步簡化stringToCase1(),使用type關鍵字讓函式變成一個自定義型別。
PS:一般情況下會將type的自定義型別寫在main()的上面。
type caseFunc func(string) string func main() { ...... } func stringToCase2(str string, myfunc caseFunc) string { return myfunc(str) }
這時在main()裡執行stringToCase2()函式,並將上面processcase1()函式作為引數變數使用:
fmt.Println(stringToCase2(str, processCase1))
寫一個判斷奇偶數的例子:
先寫一個判斷奇數的函式,
func isEven(num int) bool {
if num%2 == 0 {
return true
}
return false
}
再寫一個判斷偶數的函式,
func isOdd(num int) bool { if num%2 == 0 { return false } return true }
接著寫一個過濾函式,這裡的for迴圈計數變數不需要記錄,所以使用了匿名變數。
func filter(arr []int, f myFunc) []int {
var result []int
for _, value := range arr {
if f(value) {
result = append(result, value)
}
}
return result
}
這樣就完成了整個例子所要使用的函式,我們再將申請一個自定義型別,放在main()的上面,來實現所有功能。
type myFunc func(int) bool
func main() {
var nums = []int{10, 20, 30, 15, 17, 21, 33, 22, 57, 88, 99}
fmt.Println(filter(nums,isEven))
fmt.Println(filter(nums,isOdd))
}
最後得到結果:
[10 20 30 22 88]
[15 17 21 33 57 99]