5.4 Go 匿名函数与闭包

news2024/10/5 16:23:22

在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 引言
      • 匿名函数
        • 定义和使用
        • 使用场景
      • 闭包
        • 基本概念
        • 示例
      • 高级使用技巧
        • 延迟执行
        • 错误处理
        • 并发编程
      • 结语


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容

引言

在Go语言中,匿名函数和闭包是两个非常强大的概念,它们为开发者提供了极大的灵活性和表达力。对于中高级开发者来说,深入理解并掌握这些概念,将有助于编写更简洁、更高效的代码。

匿名函数

在Go语言中,匿名函数是一个没有名称的函数,它可以在需要时立即定义并使用。匿名函数通常用于需要临时函数的地方,或者作为参数传递给其他函数。

定义和使用

匿名函数的定义非常简单,它看起来就像一个普通的函数,但没有函数名。下面是定义和使用匿名函数的一个例子:

func main() {
    // 定义一个匿名函数并立即调用
    func() {
        fmt.Println("Hello, anonymous function!")
    }() // 注意这里的括号,表示立即调用

    // 将匿名函数赋值给变量
    greet := func(name string) {
        fmt.Printf("Hello, %s!\n", name)
    }
    greet("Go Developer")
}

使用场景

匿名函数的一个常见用途是作为回调函数。例如,你可以定义一个处理特定任务的匿名函数,并将其传递给另一个函数,该函数将在某个时间点调用这个回调。

闭包

闭包是一个函数能够记住并访问其外部作用域中的变量,即使该函数在其外部作用域执行完毕后仍然可以被调用。

基本概念

闭包在Go中是通过匿名函数实现的。当一个匿名函数捕获了其外部作用域的变量时,它就形成了一个闭包。闭包允许函数携带状态,这是它与普通函数的主要区别。

示例

下面是一个创建计数器的闭包示例:

func main() {
    counter := newCounter()
    fmt.Println(counter()) // 输出: 1
    fmt.Println(counter()) // 输出: 2
    fmt.Println(counter()) // 输出: 3
}

func newCounter() func() int {
    count := 0
    return func() int {
        count++
        return count
    }
}

在这个例子中,newCounter 函数返回了一个匿名函数,这个匿名函数捕获了 count 变量,每次调用时都会增加 count 的值。

高级使用技巧

延迟执行

Go中的匿名函数可以与 defer 关键字一起使用,实现延迟执行的效果。这在需要初始化或清理资源时非常有用。

func main() {
    defer func() {
        fmt.Println("Deferred function called")
    }()

    fmt.Println("Main function running")
}

错误处理

在Go中,错误处理通常通过返回错误值来实现。使用闭包,我们可以创建一个错误处理的上下文,使得错误处理更加灵活。

func handleError(fn func() error) {
    if err := fn(); err != nil {
        fmt.Printf("An error occurred: %v\n", err)
    }
}

func main() {
    handleError(func() error {
        // 模拟可能发生的错误
        return errors.New("something went wrong")
    })
}

并发编程

Go的并发模型是基于goroutine的,匿名函数可以轻松地与goroutine结合使用,实现并发执行。

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            fmt.Printf("Goroutine %d is running\n", id)
        }(i)
    }
    wg.Wait()
}

结语

匿名函数和闭包是Go语言中的重要特性,它们提供了强大的编程能力。通过本文的介绍,希望能够帮助中高级开发者更好地理解和使用这些特性,编写出更加优雅和高效的代码。记住,掌握这些技巧将使你在Go语言的世界中更加游刃有余。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024/5/27 英语每日一段

Rejecting diet culture became something of a feminist cause. “A growing number of women are joining in an anti-diet movement,” The New York Times reported in 1992. “They are forming support groups and ceasing to diet with a resolve similar to that of se…

一篇文章带你快速搞定Kafka术语no.2

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的&#xff0c;这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与…

Spring Boot 系统学习第三天:Spring依赖注入原理分析

1.概述 Spring中关于依赖注入的代码实现非常丰富&#xff0c;涉及大量类和组件之间的协作与交互。从原理上讲&#xff0c;任何一个框架都存在一条核心执行流程&#xff0c;只要抓住这条主流程&#xff0c;就能把握框架的整体代码结构&#xff0c;Spring也不例外。无论采用何种依…

利用阅读APP3.0目录展示要查看的内容01

喜欢读电子书的小伙伴往往会遇到一个问题&#xff0c;就是想要看书中某些内容&#xff0c;但是不知道具体章节&#xff0c;所以就用查找功能来查&#xff0c;但是呢查找功能查出来展示的结果并不直观。 比如想要阅读:青竹蜂云剑&#xff0c;大衍决&#xff0c;南宫婉&#xff0…

【Unity之FGUI】Fairy GUI面板的创建相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

【Linux安全】Firewalld防火墙基础

目录 一、Firewalld概述 二、Firewalld和iptables的关系 三、Firewalld网络区域 1、firewalld防火墙预定义了9个区域: 2、firewalld 数据包处理原则 3、firewalld数据处理流程 4、firewalld检查数据包的源地址的规则 四、Firewalld防火墙的配置方法 1、firewalld 命令…

安全存储网关怎么实现多个存储统一管理和访问?

安全存储网关是一种网络安全产品&#xff0c;用于保护存储系统和数据。它的主要功能包括数据加密、访问控制、数据审计和监控等。安全存储网关可以用于防止未经授权的访问、数据泄露和数据篡改等安全威胁。它们通常与存储设备集成&#xff0c;提供对数据的端到端保护&#xff0…

【QT环境配置】节约msvc2017灰色不可用问题

1. 问题 msvc2017不可用&#xff0c;2019、2022都同理解决。 2. 解决 打开控制面板->程序->程序和功能->找到自己安装的vs程序->鼠标右键后出现卸载更改->点击更改 找到下面组件即可。&#xff08;msvc2019就找msvcv142&#xff09;

05.爬虫---urllib与requests请求实战(GET)

05.urllib与Requests请求实战GET 1.Urllib模块2.Requests模块3.对比4.实战 GET请求 Python中的GET请求也是HTTP协议中的一种请求方法&#xff0c;用于向服务器请求数据。与POST请求不同&#xff0c;GET请求将数据以查询字符串的形式附加在URL后面&#xff0c;而不是封装在请求体…

[Linux]第一个小程序-进度条

回车,换行概念 \n&#xff1a;回车&#xff0c;换行 回车&#xff1a;回到最开始 换行&#xff1a;回到最新的一行 缓冲区概念 #include <stdio.h> int main() {printf("hello Makefile!\n");sleep(3);return 0; } #include <stdio.h> int main() {pr…

邦之信短信分析:验证码短信、营销短信与通知短信的差异化解析

在数字通讯时代&#xff0c;短信已成为我们日常生活中不可或缺的一部分。其中&#xff0c;验证码短信、营销短信和通知短信各自扮演着不同的角色。今天&#xff0c;飞鸽将带您深入了解这三种短信类型之间的核心差异。 1. 验证码短信 验证码短信广泛应用于各类电商网站和…

使用Prometheus组件node_exporter采集linux系统的指标数据(包括cpu/内存/磁盘/网络)

一、背景 Linux系统的基本指标包括cpu、内存、磁盘、网络等&#xff0c;其中网络可以细分为带宽进出口流量、连接数和tcp监控等。 本文使用Prometheus组件node_exporter采集&#xff0c;存储在promethues&#xff0c;展示在grafana面板。 二、安装node_exporter 1、下载至本…

【C++】CentOS环境搭建-升级 OpenSSL

【C】CentOS环境搭建-升级 OpenSSL 下载 OpenSSL 源代码解压源代码进入源代码目录配置编译选项报错Cant locate IPC/Cmd.pm in INC (INC contains: /usr/local/openssl-3.3.0/util/perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/shar…

Python编程-后端开发之Django5应用请求处理与模板基础

Python编程-后端开发之Django5应用请求处理与模板基础 最近写项目&#xff0c;刚好用到了Django&#xff0c;现在差不多闲下来&#xff0c;个人觉得单体项目来讲django确实舒服&#xff0c;故写此总结 模板语法了解即可&#xff0c;用到了再看&#xff0c;毕竟分离已经是主流操…

幼儿园管理系统-收退费管理原型模版

幼儿园管理系统是专为幼儿园打造&#xff0c;涵盖学校儿童、职工人事、收费财务、后勤管理、办公教务、膳食分析、体检保健、文档管理等各方面内部管理的幼儿园专家系统。 本次分享给大家的是雅居乐教育集团幼儿园园务管理系统中“收退费管理”模块的设计文档。收退费管理是幼儿…

报错:c2665 ”loadimage“没有重载函数可以转换所有参数类型

解决方法: 右键项目选择属性-》高级-》字符集-》使用多字节字符集-》确定

IO多路复用模型原理

在linux没有实现epoll事件驱动机制之前,常规的手段是选择select和poll等IO多路复用的方法来实现并发服务程序。但是在大数据、高并发、集群情况下,select和poll的性能瓶颈就出现了,于是epoll就诞生了 Select select函数监视的文件描述符分三类:writefds、readfds和exceptf…

国内首个智能体生态大会!2024百度万象大会定档5月30日

最近&#xff0c;百度悄悄「上新」了几个AI神器。 百度搜索上线「互动」功能&#xff0c;可以实时问答&#xff0c;查询信息就像聊天一样简单&#xff0c;还可以艾特相关智能体&#xff0c;更细致精确地满足个性化需求&#xff0c;比如去新加坡旅游&#xff0c;可以让新加坡旅…

【源码】2024心悦搜剧源码百万级网盘资源

1、一键转存他人链接&#xff1a;就是将别人的分享链接转为你自己的 2、转存心悦搜剧资源&#xff1a;就是将心悦搜剧平台上的所有资源都转成你自己的 3、每日自动更新&#xff1a;自动转存每天的资源并入库 前端uin-app&#xff0c;后端PHP&#xff0c;兼容微信小程序