samber/lo 库的使用方法:Error

samber/lo 库的使用方法:Error

samber/lo 是一个 Go 语言库,提供了一些常用的集合操作函数,如 Filter、Map 和 FilterMap。
这个库函数太多,因此我决定按照功能分别介绍,本文介绍的是 samber/lo 库中Error相关的函数。汇总目录页面

Validate

当条件不满足时,创建一个错误。

slice := []string{"a"}
val := lo.Validate(len(slice) == 0, "Slice should be empty but contains %v", slice)
// error("Slice should be empty but contains [a]")slice := []string{}
val := lo.Validate(len(slice) == 0, "Slice should be empty but contains %v", slice)
// nil

[play]

Must

对函数调用进行包装,函数的返回需要两个参数,第一个是值,第二个是错误。如果第二个参数是错误或者false,那么就会panic,否则返回值。

val := lo.Must(time.Parse("2006-01-02", "2022-01-15"))
// 2022-01-15val := lo.Must(time.Parse("2006-01-02", "bad-value"))
// panics

[play]

Must{0->6}

和Must一样,但是返回多个值。

func example0() (error)
func example1() (int, error)
func example2() (int, string, error)
func example3() (int, string, time.Date, error)
func example4() (int, string, time.Date, bool, error)
func example5() (int, string, time.Date, bool, float64, error)
func example6() (int, string, time.Date, bool, float64, byte, error)lo.Must0(example0())
val1 := lo.Must1(example1())    // alias to Must
val1, val2 := lo.Must2(example2())
val1, val2, val3 := lo.Must3(example3())
val1, val2, val3, val4 := lo.Must4(example4())
val1, val2, val3, val4, val5 := lo.Must5(example5())
val1, val2, val3, val4, val5, val6 := lo.Must6(example6())

可以包装像func (...) (..., ok bool)这样的函数。当ok为false时,会panic。

// math.Signbit(float64) bool
lo.Must0(math.Signbit(v))// bytes.Cut([]byte,[]byte) ([]byte, []byte, bool)
before, after := lo.Must2(bytes.Cut(s, sep))

可以通过添加一些类似printf的参数来给panic消息添加上下文。

val, ok := lo.Find(myString, func(i string) bool {return i == requiredChar
})
lo.Must0(ok, "'%s' must always contain '%s'", myString, requiredChar)list := []int{0, 1, 2}
item := 5
lo.Must0(lo.Contains[int](list, item), "'%s' must always contain '%s'", list, item)
...

[play]

Try

调用函数,如果出现错误或者panic,返回false。

ok := lo.Try(func() error {panic("error")return nil
})
// falseok := lo.Try(func() error {return nil
})
// trueok := lo.Try(func() error {return fmt.Errorf("error")
})
// false

[play]

Try{0->6}

和Try一样,但是回调函数返回对应数量的变量。

ok := lo.Try2(func() (string, error) {panic("error")return "", nil
})
// false

[play]

TryOr

调用函数,如果出现错误或者panic,返回默认值。

str, ok := lo.TryOr(func() (string, error) {panic("error")return "hello", nil
}, "world")
// world
// falsestr, ok := lo.TryOr(func() error {return "hello", nil
}, "world")
// hello
// truestr, ok := lo.TryOr(func() error {return "hello", fmt.Errorf("error")
}, "world")
// world
// false

[play]

TryOr{0->6}

和TryOr一样,但是回调函数返回对应数量的变量及error。

str, nbr, ok := lo.TryOr2(func() (string, int, error) {panic("error")return "hello", 42, nil
}, "world", 21)
// world
// 21
// false

[play]

TryWithErrorValue

和Try一样,但是返回传给panic的值。

err, ok := lo.TryWithErrorValue(func() error {panic("error")return nil
})
// "error", false

[play]

TryCatch

和Try一样,但是在出现错误时调用catch函数。

caught := falseok := lo.TryCatch(func() error {panic("error")return nil
}, func() {caught = true
})
// false
// caught == true

[play]

TryCatchWithErrorValue

TryWithErrorValue一样,但是在出现错误时调用catch函数。

caught := falseok := lo.TryCatchWithErrorValue(func() error {panic("error")return nil
}, func(val any) {caught = val == "error"
})
// false
// caught == true

[play]

ErrorsAs

是一个快捷方式,相当于:

err := doSomething()var rateLimitErr *RateLimitError
if ok := errors.As(err, &rateLimitErr); ok {// retry later
}

lo实现:

err := doSomething()if rateLimitErr, ok := lo.ErrorsAs[*RateLimitError](err); ok {// retry later
}

[play]

汇总目录页面

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

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

相关文章

ZS Associates致盛咨询是什么公司?排名怎么样?

随着商业化时代的加速演进,咨询公司在企业发展中的“智囊团”角色愈发突显。对于医药企业来说,一个优秀的咨询团队不仅可以帮助推动整体战略转型及内部改革,还对药品研发、营销起到优化促进作用。 那什么样的咨询企业可称之为优秀的咨询企业…

6.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-通过逆向分析确定游戏明文发送数据过程

内容参考于:易道云信息技术研究院VIP课 上一个内容:测试需求与需求拆解 在开始之前要了解一个小知识,在逆向开始之前要很清楚知道要找的东西是什么,大概长什么样子,只有这样才能看到它第一眼发现它,现在我…

129 Linux 系统编程7 ,make 的编写和解析

前文中,我们有多少个.c文件,就需要build 出来多少个.o文件 假设我们的项目很大,怎么管理这些 .c文件呢? 这里就要学习一个make文件的编写了。 makefile 本质上是一个脚本语言 脚本语言实际上就是将一系列命令放在一起执行 mak…

Jetson Xavier NX 与笔记本网线连接 ,网络共享,ssh连接到vscode

Jetson Xavier NX 与笔记本网线连接 ,网络共享,ssh连接到vscode Jetson Xavier NX桌面版需要连接显示屏、鼠标和键盘,操作起来并不方便,因此常常需要ssh远程连接到本地笔记本电脑,这里介绍一种连接方式,通过…

java面试题:数字与字母的映射表

前言 好记性不如烂笔头。 问题: 现在有一个数字与字母的映射表,且有以下规则: 映射表: 数字 字母 3 A 7 B 9 C 规则: 1.碰到当前数字时,使用字母替换,例如,3-> A 2.碰到当前数…

竞技游戏中的失败认知与心理调适:面对不甘心的挑战

在当今社会,电子竞技游戏已成为众多年轻人休闲娱乐的重要方式,而竞技游戏中的胜负常态,往往伴随着玩家心态的起伏跌宕。尤其是当玩家面临即将失败的局面时,内心的不甘情绪尤为强烈。本文旨在探讨这种明知败局已定但仍心有不甘的现…

如何不患心肌梗塞

目录 一,个人面板 二,公共版图 三,卡牌 1,食物牌 2,药物牌 3,事件牌 四,回合操作 1,起始玩家 2,一轮操作 3,个人回合 4,轮末结算 5&a…

Vision Transfomer系列第二节---Tricks测试

目录 学习式和固定式位置编码测试dropout的作用测试block深度的作用测试embeding维度大小的作用测试多头的作用测试Overlap Patch的作用 学习式和固定式位置编码测试 主要测试无位置编码\可学习位置编码和固定式位置编码的训练效果: 其中固定式位置编码采用之前博客的正余弦位…

第十一天-Excel的操作

目录 1.xlrd-Excel的读模块 安装 使用 获取工作簿 读取工作簿的内容 xlsxwriter-Excel的写模块 安装 使用 生成图表 add_series参数 图表的样式 demo:生成图表 Excel的操作在python中有多个模块,为了能够快速使用,选择了相对简单…

【More Effective C++】条款7:不要重载、||和,操作符

真假值表达式: 一旦真假值确定,即使表达式中有尚未计算的部分,也不会计算表达式的计算总是从左向右计算 不能重载的 && 和 || 的理由: 所有的表达式都需要计算不确定函数调用顺序 int rangeCheck(int index, int lowe…

【Docker】初学者 Docker 基础操作指南:从拉取镜像到运行、停止、删除容器

在现代软件开发和部署中,容器化技术已经成为一种常见的方式,它能够提供一种轻量级、可移植和可扩展的应用程序打包和部署解决方案。Docker 是目前最流行的容器化平台之一,它提供了一整套工具和技术,使得容器的创建、运行和管理变得…

想设计智能手环,我需要设计哪种电路?

随着电子技术的高速发展,可穿戴设备逐渐火爆,其中之一是智能手环,作为现代可穿戴技术的热门产品之一,它集成了多种功能,如健康检测、运动跟踪、通知提醒等,为了实现这些功能,需要用上哪些电路模…

模板注入 [WesternCTF2018]shrine1

打开题目 直接查看源代码 发现注册了一个名为FLAG的config,这里可能有flag, 存在flask-jinja2模板注入, 并且存在黑名单过滤 输入shrine/{{7*7}}验证成功 通过url_for()与globals()函数,绕过黑名单 /shrine/{{url_for.__globa…

Android 输入法框架简介

每种平台都有自己的输入法框架. GNU/Linux 桌面环境有多种输入法框架, 比如 ibus, fcitx 等. 但是 Android 操作系统只有一种, 是统一提供的输入法框架. 相关链接: 《ibus 源代码阅读 (1)》 https://blog.csdn.net/secext2022/article/details/136099328https://developer.and…

人工智能有可能替代人来吗 ?

人工智能在不断发展的过程中,确实有可能在某些领域替代人类工作。这种替代并不是指完全取代人类,而是指在特定任务或领域中,人工智能可以表现出比人类更高效、更精准的能力。 以下是人工智能可能替代人类工作的几个方面: 重复性任…

2024年 最新python调用ChatGPT实战教程

2024年 最新python调用ChatGPT实战教程 文章目录 2024年 最新python调用ChatGPT实战教程一、前言二、具体分析1、简版程序2、多轮对话3、流式输出4、返回消耗的token 一、前言 这个之前经常用到,简单记录一下,注意目前chatgpt 更新了,这个是最新版的&am…

MIT-BEVFusion系列九--CUDA-BEVFusion部署4 c++解析pytorch导出的tensor数据

目录 创建流打印 engine 信息打印结果内部流程 启动计时功能加载变换矩阵并更新数据(重要)内部实现 该系列文章与qwe一同创作,喜欢的话不妨点个赞。 在create_core方法结束后,我们的视角回到了main.cpp中。继续来看接下来的流程。…

挑战杯 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…

CSV数据导入到ClickHouse数据库

问题描述:手头上有一个数据量较大的CSV文件,希望导入到指定的ClickHouse数据中,ClickHouse部署在服务器中。 解决方案:通常来说,数据量较少的CSV文件可以直接通过DBeaver软件的可视化界面导入数据。 若数据量较大&…

解释C++中的模板元编程

C中的模板元编程(Template Metaprogramming,TMP)是一种利用模板实现在编译时进行计算和代码生成的技术。这意味着你可以在编译时执行那些通常在运行时进行的操作,如条件判断、循环以及函数调用。模板元编程可以用来生成高度优化和…