GO語言————6.7 將函式作為引數

FLy_鵬程萬里發表於2018-06-30

6.7 將函式作為引數

函式可以作為其它函式的引數進行傳遞,然後在其它函式內呼叫執行,一般稱之為回撥。下面是一個將函式作為引數的簡單例子(function_parameter.go):

package main

import (
	"fmt"
)

func main() {
	callback(1, Add)
}

func Add(a, b int) {
	fmt.Printf("The sum of %d and %d is: %d\n", a, b, a+b)
}

func callback(y int, f func(int, int)) {
	f(y, 2) // this becomes Add(1, 2)
}

輸出:

The sum of 1 and 2 is: 3

將函式作為引數的最好的例子是函式 strings.IndexFunc()

該函式的簽名是 func IndexFunc(s string, f func(c int) bool) int,它的返回值是在函式 f(c) 返回 true、-1 或從未返回時的索引值。

例如 strings.IndexFunc(line, unicode.IsSpace) 就會返回 line 中第一個空白字元的索引值。當然,您也可以書寫自己的函式:

func IsAscii(c int) bool {
	if c > 255 {
		return false
	}
	return true
}

在第 14.10.1 節中,我們將會根據一個客戶端/服務端程式作為示例對這個用法進行深入討論。

type binOp func(a, b int) int
func run(op binOp, req *Request) { … }

練習 6.7

包 strings 中的 Map 函式和 strings.IndexFunc() 一樣都是非常好的使用例子。請學習它的原始碼並基於該函式書寫一個程式,要求將指定文字內的所有非 ASCII 字元替換成 ? 或空格。您需要怎麼做才能刪除這些字元呢?

相關文章