关于go:go语法入门匿名函数

一、介绍

Go语言反对匿名函数,即在须要应用函数时再定义函数,匿名函数没有函数名只有函数体,函数能够作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量形式传递,这与C语言的回调函数比拟相似,不同的是,Go语言反对随时在代码里定义匿名函数。

匿名函数是指不须要定义函数名的一种函数实现形式,由一个不带函数名的函数申明和函数体组成,上面来具体介绍一下匿名函数的定义及应用。

1.1 定义 匿名函数

fun(参数)返回{
    函数体
}

匿名函数的定义就是没有名字的一般函数定义。

1.2 定义 匿名函数的两种形式

匿名函数因为没有函数名,所以没方法像一般函数那样调用,所以匿名函数须要保留到某个变量或者作为立刻执行函数:

  1. 保留到某个变量
  2. 立刻执行函数
package main
 
import "fmt"
 
func main()  {
    // 定义匿名函数形式一
    add := func (x, y int)  {
        fmt.Println(x + y)
    }
    add(1, 2)  // 通过变量调用匿名函数
 
    // 定义匿名函数形式二
    func (x, y int)  {
        fmt.Println(x - y)
    }(20, 5)  //自执行函数:匿名函数定义完加()间接执行
}

1.3 匿名函数的两种场景(回调函数,闭包)

1.3.1 回调函数

func callFunc(base int, f func(int, int) int) {
    num := f(base, 5) // 缩小或者加上5
    fmt.Printf("base %d 通过f解决后值是:%d \n", base, num)
}
func TestCallFunc(t *testing.T) {
    addNum := func(base, num int) int {
        return base + num
    }
    callFunc(100, addNum)
}

输入:

=== RUN   TestCallFunc
base 100 通过f解决后值是:105 
--- PASS: TestCallFunc (0.00s)

1.3.2 闭包

func TestClosure(t *testing.T) {
    var j int = 1

    f := func() {
        var i int = 1
        fmt.Printf("i, j: %d, %d\n", i, j)
    }

    f()
    j += 2
    f()
}

输入:

=== RUN   TestClosure
i, j: 1, 1
i, j: 1, 3
--- PASS: TestClosure (0.00s)

在下面的示例中,匿名函数援用了内部变量,所以同时也是个闭包,变量 f 指向的闭包援用了局部变量 i 和 j,i 在闭包外部定义,其值被隔离,不能从内部批改,而变量 j 在闭包内部定义,所以能够从内部批改,闭包持有的只是其援用。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理