5.4 Go 匿名函数与闭包


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

  • 推荐:「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()) // 输出: 1fmt.Println(counter()) // 输出: 2fmt.Println(counter()) // 输出: 3
}func newCounter() func() int {count := 0return 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.WaitGroupfor 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.rhkb.cn/news/332819.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不能错过的AI知识学习神器「Mo卡片」

1. 「Mo卡片」——知识点的另一种承载方式 1.1 产品特点 &#x1f4f1;一款专为渴望理解和掌握人工智能知识的小伙伴量身打造的轻量级 App。 &#x1f3f7;AI 知识卡片集 Mo卡片内置了 26 套卡片集&#xff0c;总计 1387 张卡片&#xff0c;每张卡片都能获得 1 个核心知识。…

GpuMall智算云:AUTOMATIC1111/stable-diffusion-webui/stable-diffusion-webui-v1.8.0

配置环境介绍 目前平台集成了 Stable Diffusion WebUI 的官方镜像&#xff0c;该镜像中整合如下资源&#xff1a; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本&#xff1a;v1.8.0 Python版本&#xff1a;3.10.…

如何用 Redis 统计海量 UV?

引言&#xff1a;在当今数字化时代&#xff0c;对于网站和应用程序的运营者而言&#xff0c;了解其用户的行为和习惯是至关重要的。其中&#xff0c;衡量页面的独立访客数量&#xff08;UV&#xff09;是评估网站流量和用户参与度的重要指标之一。然而&#xff0c;当面对海量访…

基于物联网表计的综合能源管理方案

安科瑞电气股份有限公司 祁洁 acrelqj 摘要&#xff1a;为加快推进国家“双碳”战略和新型能源体系建设&#xff0c;努力实现负荷精准控制和用户精细化管理&#xff0c;按照“政府主导、电网组织、政企协同、用户实施”的指导原则&#xff0c;多地成立市/县级电力负荷管理中…

VMware Workstation 虚拟机安装 ubuntu 24.04 server 详细教程 服务器安装图形化界面

1 阿里云下载 ubuntu-releases安装包下载_开源镜像站-阿里云 2 打开vmware,新建虚拟机 3 选择下载的镜像,开始安装 3 光驱这里修改下 4 重新启动&#xff0c;安装图形化界面 #更新软件包列表 sudo apt-get update #安装Ubuntu图形桌面 sudo apt install ubuntu-desktop 5 安…

弱密码系统登录之后强制修改密码

在你登录的时候&#xff0c;获取到弱密码&#xff0c;然后将他存到vuex里面&#xff0c;在登录进去之后&#xff0c;index页面再去取&#xff0c;思路是这样的 一、vuex里面定义密码字段 我是直接在user.js里面写的 import { login, logout, getInfo } from /api/login impo…

动手学深度学习22 池化层

动手学深度学习22 池化层 1. 池化层2. 实现3. QA 课本&#xff1a; https://zh-v2.d2l.ai/chapter_convolutional-neural-networks/pooling.html 视频&#xff1a; https://www.bilibili.com/video/BV1EV411j7nX/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ceba9c9a2e5f0…

清理mysql binglog文件

mysql随着使用时间的推移&#xff0c;binglog文件会越来越大&#xff0c;比如我们的oa系统&#xff0c;上线4年多了&#xff0c;最近总有磁盘空间满影响系统正常使用的情况出现。检查后发现binglog是罪归祸首。 binglog文件最好不要采用应删除的方式清理&#xff0c;如下方式可…

X-CSV-Reader:一个使用Rust实现CSV命令行读取器

&#x1f388;效果演示 ⚡️快速上手 依赖导入&#xff1a; cargo add csv读取实现&#xff1a; use std::error::Error; use std::fs::File; use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {le…

【机器学习】——线性模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Blender人物插件Human Generator Ultimate下载及打开方式

一、Blender介绍及安装 Blender是一款免费开源三维图形图像软件&#xff0c;提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。 安装方式非常简单&#xff0c;官网下载即可&#xff0c;截止到2024年5月&#xff0c;Blender以更新至4.1版本了…

Bonfire - [Asset for Zibra Smoke Fire]

Bonfire资产支持URP、BRP和HDRP渲染管道,可以用作VFX或游戏元素。 这种环境资产可用于增强视觉故事性,以及创建自定义游戏机制,为虚拟世界增加互动性和真实性。 全交互:使用Zibra Smoke&Fire进行实时烟雾模拟。 易于使用:您所需要做的就是购买资产并将其放入场景中。不…

深入分析 Android Activity (六)

文章目录 深入分析 Android Activity (六)1. Activity 的权限管理1.1 在 Manifest 文件中声明权限1.2 运行时请求权限1.3 处理权限请求结果1.4 处理权限的最佳实践 2. Activity 的数据传递2.1 使用 Intent 传递数据2.2 使用 Bundle 传递复杂数据 3. Activity 的动画和过渡效果3…

技术面‍:前端代码是如何与服务器交互的

前言&#xff1a; 本篇文章主要是想讲解 .html 文件和 .CSS 文件在实际开发中和后端服务器交互最后上线的基础原理。 面向的人群&#x1f195;&#xff1a;是刚入行不久&#xff0c;且目前只会写前端业务代码而不清楚整个工作流的前端新人。我会从 0 开始一步一步带你理解整个…

当HR问你是否单身时,该怎么回答?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我是晶圆厂厂务工程师&#xff0c;最近在面试新工作&#xff0c;但是几乎每家HR都会问我同一个问题&#xff1a;你结婚没有&#xff1…

短剧平台开发中的常见误区及避坑指南,别再走弯路

1. 误区一&#xff1a;只注重外观&#xff0c;忽视技术基础 在短剧平台开发中&#xff0c;一个常见的误区是过于注重产品的外观设计&#xff0c;而忽视了技术基础的重要性。团队往往会投入大量精力和资源来打造吸引人的UI和炫酷的特效&#xff0c;但忽略了系统架构、性能优化和…

听说京东618裁员?所以日常准备很重要呀

文末有最少必要的面试题&#xff0c;还准备了离线 PDF 版本。 京东也要向市场输送人才了? 这几天看到技术群里不少朋友在讨论京东裁员相关的信息。 我去看了下京东近期的操作&#xff0c;京东内部考勤调整和午休时间缩短&#xff0c;以及强化打卡机制等管理调整&#xff1b;有…

腾讯Java社招面试题真题,最新面试题

Java中synchronized和ReentrantLock有什么区别&#xff1f; 1、锁的实现方式不同&#xff1a; synchronized是JVM层面的锁&#xff0c;主要依赖于监视器对象&#xff08;monitor&#xff09;实现。ReentrantLock是JDK层面的锁&#xff0c;通过Java代码实现&#xff0c;提供了更…

echarts- 热力图, k线图,雷达图

热力图 热力图可以看成是一种矩形的散点图。 热力图的矩形受itemStyle的影响。 通常配合visualmap组件来根据值的大小做颜色的变化。 热力图主要通过颜色去表现数值的大小&#xff0c;必须要配合 visualMap 组件使用。 visualMap:视觉映射组件 let options {tooltip: {},xAx…

Kali的基本扫描命令

nmap -sP 192.168.10.0/24 //扫描10网段存活的主机 nmap -P 192.168.10.142 //扫描主机开放的端口 nmap -sS 192.168.10.142 //TCP半开扫描 nmap -sT 192.168.10.142 //TCP全开扫描 nmap -O 192.168.10.142 //扫描靶机的操作系统类型 nmap -sV 192.168.10.142 //扫描开放端口对…