go语言中立即调用的匿名函数

server/2025/3/13 20:07:52/

先看代码


type CachedProductQuery struct {productQuery ProductQuerycacheClient  *redis.Clientprefix       string
}func (c CachedProductQuery) GetById(productId int) (product Product, err error) {cachedKey := fmt.Sprintf("%s_%s_%d", c.prefix, "product_by_id", productId)cachedResult := c.cacheClient.Get(c.productQuery.ctx, cachedKey)err = func() error {if err := cachedResult.Err(); err != nil {return err}cachedResultByte, err := cachedResult.Bytes()if err != nil {return err}err = json.Unmarshal(cachedResultByte, &product)if err != nil {return err}return nil}()if err != nil {product, err = c.productQuery.GetById(productId)if err != nil {return Product{}, err}encoded, err := json.Marshal(product)if err != nil {return product, nil}_ = c.cacheClient.Set(c.productQuery.ctx, cachedKey, encoded, time.Hour)}return
}

利用缓存,优化服务的一段代码。

其中运用了立即调用的匿名函数:

err = func() error { ... }() 这种写法的目的是封装缓存获取过程中的错误处理,使代码更加简洁且易于管理。在 Go 语言中,这种写法可以有几个好处:

1. 封装错误处理逻辑

通过使用匿名函数,我们可以把一部分错误处理逻辑封装起来,避免在每个操作后都直接写出多个 if err != nil { return err }。这样可以让代码显得更加简洁,减少重复的错误检查。

2. 局部错误处理

在这种结构下,错误处理仅限于匿名函数内部。通过匿名函数,我们可以将错误范围限定在函数内部,避免影响到外部逻辑。例如,在这个例子中,匿名函数执行后返回一个错误,便于判断缓存获取是否成功。如果匿名函数出错,err 会被赋值并在外部做进一步处理。

3. 匿名函数的立即调用

func() error { ... }() 这种写法是 Go 语言中的一个常见技巧,叫做 立即调用的匿名函数(Immediately Invoked Function Expression, IIFE)。它允许我们在一个地方直接创建并执行一个匿名函数。这种写法通常用于:

  • 错误处理
  • 简化代码
  • 为局部变量限定作用域

在这个例子中,匿名函数没有参数,它会立刻执行并返回一个错误对象。如果函数内部没有发生错误,返回 nil

4. 避免污染外部作用域

匿名函数可以帮助减少在外部作用域中定义临时变量的数量。在这种情况下,err 只在匿名函数内部定义和使用,并且在匿名函数外部会被重新赋值,这样可以确保变量的作用域仅限于函数内部。

5. 简化错误逻辑

通过这种封装,可以把复杂的错误处理逻辑分离开来。代码看起来更加紧凑,并且可以快速定位错误处理部分,而不需要在每一步操作后都重复编写错误判断。


http://www.ppmy.cn/server/174707.html

相关文章

集合知识点

1.Collection接口 1.1List接口 1.1.1 ArrayList 常用方法 Collection List ArrayList 常用方法: add(E e) 添加元素 添加在末尾 add(int index,E e) 在指定位置添加元素 clear() 从列表中删除所有元素。 contains(Object o) 如果此列表包含指定的元素&#xff0…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…

Docker搭建Redis哨兵模式【一主两从三哨兵】

Docker搭建Redis哨兵模式 系统: CentOS 7 Dockder 版本: VMware虚拟机 网络适配器 网络连接 桥接模式:直接连接物理网络查看IP命令 ip addr一、哨兵模式概述 1. 官方文档与关联博客 官方文档:https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel关联博…

【透视国家的三维棱镜:技术、制度与文化的解构与重构】

透视国家的三维棱镜:技术、制度与文化的解构与重构 一、技术层:文明的物质显影剂 技术作为生存密码 青铜器冶炼技术将部落联盟升级为商周王朝,蒸汽机将农耕文明扭转为工业文明,半导体技术正在重塑21世纪权力版图。技术是文明存续的…

高阶哈希算法

SHA-256简介 SHA-256 是 **SHA-2(Secure Hash Algorithm 2)**家族中的一种哈希算法,由美国国家安全局设计,并于 2001 年发布。它能够将任意长度的数据映射为一个固定长度256 位,即 32 字节的哈希值,通常以…

数据库---sqlite3

数据库: 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer …

第八课:Scrapy框架入门:工业级爬虫开发

在当今大数据时代,数据抓取已成为信息获取的重要手段。Scrapy作为一个基于Python的开源网络爬虫框架,凭借其高效、灵活的特性,在工业级爬虫开发中占据重要地位。本文将详细介绍Scrapy框架的基本架构、工作流程、关键组件(如Spider…

LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在构建智能 AI 助手时,我们希望模型能够智能地调用工具,以便提供准确的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION,它结合了 ReAct(Reasoning Acting)策略,使得 LLM 可以基于工具的描…