go语法入门匿名函数定义及使用示例详解

 更新时间:2023年09月06日 10:46:03   作者:海生  
这篇文章主要为大家介绍了go语法入门匿名函数定义及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、介绍

Go语言支持匿名函数,即在需要使用函数时再定义函数,匿名函数没有函数名只有函数体,函数可以作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量方式传递,这与C语言的回调函数比较类似,不同的是,Go语言支持随时在代码里定义匿名函数。

匿名函数是指不需要定义函数名的一种函数实现方式,由一个不带函数名的函数声明和函数体组成,下面来具体介绍一下匿名函数的定义及使用。

1.1 定义 匿名函数

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

匿名函数的定义就是没有名字的普通函数定义。

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 在闭包外部定义,所以可以从外部修改,闭包持有的只是其引用。

以上就是go语法入门匿名函数定义及使用示例详解的详细内容,更多关于go语法入门匿名函数的资料请关注脚本之家其它相关文章!

相关文章

  • 创建第一个Go语言程序Hello,Go!

    创建第一个Go语言程序Hello,Go!

    这篇文章主要介绍了创建第一个Go语言程序Hello,Go!本文详细的给出项目创建、代码编写的过程,同时讲解了GOPATH、Go install等内容,需要的朋友可以参考下
    2014-10-10
  • Golang Map value不可寻址使用指针类型代替示例详解

    Golang Map value不可寻址使用指针类型代替示例详解

    这篇文章主要为大家介绍了Golang Map value不可寻址使用指针类型代替示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 解决golang sync.Wait()不执行的问题

    解决golang sync.Wait()不执行的问题

    这篇文章主要介绍了解决golang sync.Wait()不执行的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang中字符串和数字转换方法

    golang中字符串和数字转换方法

    在Golang中,可以使用strconv包中的Itoa()和Atoi()函数进行字符串与数字之间的转换,Itoa()用于将数字转换为字符串,Atoi()则用于将字符串转换回数字,本文介绍golang中字符串和数字转换方法,感兴趣的朋友一起看看吧
    2024-09-09
  • Go语言利用Unmarshal解析json字符串的实现

    Go语言利用Unmarshal解析json字符串的实现

    本文主要介绍了Go语言利用Unmarshal解析json字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • go语言中sort包的实现方法与应用详解

    go语言中sort包的实现方法与应用详解

    golang中也实现了排序算法的包sort包,所以下面这篇文章主要给大家介绍了关于go语言中sort包的实现方法与应用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • Golang编程实现删除字符串中出现次数最少字符的方法

    Golang编程实现删除字符串中出现次数最少字符的方法

    这篇文章主要介绍了Golang编程实现删除字符串中出现次数最少字符的方法,涉及Go语言字符串遍历与运算相关操作技巧,需要的朋友可以参考下
    2017-01-01
  • go mutex互斥锁使用Lock和Unlock方法占有释放资源

    go mutex互斥锁使用Lock和Unlock方法占有释放资源

    Go号称是为了高并发而生的,在高并发场景下,势必会涉及到对公共资源的竞争,当对应场景发生时,我们经常会使用 mutex 的 Lock() 和 Unlock() 方法来占有或释放资源,虽然调用简单,但 mutex 的内部却涉及挺多的,本文来好好研究一下
    2023-09-09
  • GO 之运算符号的具体使用

    GO 之运算符号的具体使用

    这篇文章主要介绍了GO运算符号的具体使用,包括算术、一元、关系、逻辑、位运算及赋值运算符,感兴趣的可以了解一下
    2025-06-06
  • golang中可触发panic的几种情况汇总

    golang中可触发panic的几种情况汇总

    在Go语言中,panic是一种运行时错误处理机制,当程序遇到无法恢复的严重错误时会触发panic,本文就来详细的介绍一下golang中可触发panic的几种情况,感兴趣的可以了解一下
    2025-11-11

最新评论