一、介绍。
go语言的函数参数,一般我们常用的是,一个实际的值,比如 int,或者struct,map,指针等。
但在一些高阶的用法中,常见函数,作为参数,比如net/http库等。今天我们学一下如何使用函数作为函数的参数。
回调函数
被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数
。 以上示例为同步回调
,它是立即执行的。 然而需要注意的是,回调函数经常被用于在一个异步操作完成后执行代码,它们被称为异步回调
。
二、入门使用。
回调函数
其实说白了,函数为参数,被另一个函数使用。就是函数调用函数
我们在一个函数内,调用另外一个函数。
2.1 使用一个 最简单的 无参,无返回函数。
在这里,我们参数为printOne()或printTwo()。
我们在funcNoParam中使用它。
func printOne() {
fmt.Println("one")
}
func printTwo() {
fmt.Println("two")
}
func funcNoParam(f func()) {
f()
}
func TestFuncNoParam(t *testing.T) {
funcNoParam(printOne)
funcNoParam(printTwo)
}
在上面的示例中,我们使用printOne以及printTwo 作为 funcNoParam的参数。
执行完结果为:
=== RUN TestFuncNoParam
one
two
--- PASS: TestFuncNoParam (0.00s)
可以只要符合func()
,我们就可以传进到funcNoParam(f func())
中。
可以执行无数种函数调用。
2.2 调用一个有参函数
在这里printOneParam(p int),printOnePlus(p int),都是为一个参数的函数。
printOneParam(p int) 为直接打印出一个p值
printOnePlus(p int) 为打印出一个 p++值
我们使用funcParamOne(f func(a int))来把他们作为一个参数传进来,供自己调用。
func printOneParam(p int) {
fmt.Println(p)
}
func printOnePlus(p int) {
fmt.Println(p + 1)
}
func funcParamOne(f func(a int)) {
num := 100
f(num)
}
func TestFuncParamOne(t *testing.T) {
funcParamOne(printOneParam)
funcParamOne(printOnePlus)
}
在这里,我们定义了一个函数funcParamOne(f func(a int))
它的参数是一个带有一个int参数的函数,我们在funcParamOne调用了f。
然后我们我们调用了两个符合 func(a int)
类型的函数,printOneParam以及printOnePlus。
结果为:
=== RUN TestFuncParamOne
100
101
--- PASS: TestFuncParamOne (0.00s)
2.3 调用一个有返回值函数
func funcInt64(f func() int64) string {
return fmt.Sprintf("string之为: %d", f())
}
func TestFuncInt64(t *testing.T) {
t.Log(funcInt64(rand.Int63))
t.Log(funcInt64(time.Now().Unix))
}
在这里,我们调用了rand.Int63(),以及 time.Now().Unix()
输出结果:
=== RUN TestFuncInt64
string之为: 5577006791947779410
string之为: 1676257027
--- PASS: TestFuncInt64 (0.00s)
注意,我们调用函数的时候,都没有加上()
,是因为在里面我们加上了括号,不然就两个括号了。
2.4 一个函数,一个变量,两个参数
func ReduceNUm(base int, num int) {
fmt.Printf("%d减少%d后为:%d\n", base, num, base-num)
}
func AddNum(base, num int) {
fmt.Printf("%d加上%d后为:%d\n", base, num, base+num)
}
func callback(base int, f func(int, int)) {
f(base, 5) // 减少或者加上5
}
func TestCallback(t *testing.T) {
callback(100, ReduceNUm)
callback(100, AddNum)
}
输出:
=== RUN TestCallback
100减少5后为:95
100加上5后为:105
--- PASS: TestCallback (0.00s)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。