一、介绍。

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)

海生
104 声望32 粉丝

与黑夜里,追求那一抹萤火。