1. 程式人生 > >Golang學習筆記(十一)函式變數,將函式作為值使用

Golang學習筆記(十一)函式變數,將函式作為值使用

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]