Files
the-way-to-go_ZH_CN/eBook/06.7.md

60 lines
1.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 6.7 将函数作为参数
函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调。下面是一个将函数作为参数的简单例子([function_parameter.go](examples/chapter_6/function_parameter.go)
```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 rune) bool) int`,它的返回值是字符串 s 中第一个使函数 `f(c)` 返回 `true` 的 Unicode 字符的索引值。如果找不到,则返回 -1。
例如 `strings.IndexFunc(line, unicode.IsSpace)` 就会返回 `line` 中第一个空白字符的索引值。当然,您也可以书写自己的函数:
```go
func IsAscii(c int) bool {
if c > 255 {
return false
}
return true
}
```
在[第 14.10.1 节](14.10.md) 中,我们将会根据一个客户端/服务端程序作为示例对这个用法进行深入讨论。
```go
type binOp func(a, b int) int
func run(op binOp, req *Request) { }
```
**练习 6.7** [strings_map.go](exercises/chapter_6/strings_map.go)
`strings` 中的 `Map()` 函数和 `strings.IndexFunc()` 一样都是非常好的使用例子。请学习它的源代码并基于该函数书写一个程序,要求将指定文本内的所有非 ASCII 字符替换成问号 `'?'` 或空格 `' '`。您需要怎么做才能删除这些字符呢?
## 链接
- [目录](directory.md)
- 上一节:[递归函数](06.6.md)
- 下一节:[闭包](06.8.md)