Golang errors 包快速上手
文章目录
- 1.变量
- 2.类型
- 3.函数
- 3.1 New
- 3.2 Is
- 简介
- 函数签名
- 核心功能
- 示例代码
- 使用场景
- 注意事项
- 小结
- 3.3 As
- 简介
- 函数签名
- 核心功能
- 示例代码
- 使用场景
- 注意事项
- 小结
- 3.4 Unwrap
- 简介
- 函数签名
- 核心功能
- 使用示例
- 使用场景
- 注意事项
- 小结
- 3.5 Join
- 简介
- 函数签名
- 核心功能
- 使用场景
- 注意事项
- 小结
- 4.小结
- 参考文献
在 Golang 中,errors 包是用于处理错误的标准库, errors 包提供的功能比较简单,使用起来非常方便。
接下来具体讲解一下 errors 包提供的变量、类型和函数。
1.变量
errors 包只定义了一个全局变量 ErrUnsupported。
var ErrUnsupported = New("unsupported operation")
ErrUnsupported 表示请求的操作不能执行,因为它不受支持。例如,调用os.Link()当使用的文件系统不支持硬链接时。
函数和方法不应该返回这个错误,而应该返回一个包含适当上下文的错误,满足:
errors.Is(err, errors.ErrUnsupported)
要么直接包装 ErrUnsupported,要么实现一个 Is 方法。
函数和方法应该说明何种情况下会返回包含 ErrUnsupported 的错误。
2.类型
error 是一个内建的接口类型,任何类型只要实现了 Error() string 方法,就实现了 error 接口,这意味着该类型的实例可以被当作一个 error 来处理。
// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {Error() string
}
3.函数
3.1 New
errors.New 用于创建一个新的错误对象。它接收一个字符串作为错误消息,并返回一个错误对象。
func New(text string) error
我们可以看下其具体实现:
// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {return &errorString{text}
}// errorString is a trivial implementation of error.
type errorString struct {s string
}func (e *errorString) Error() string {return e.s
}
可以看到,New 返回的是实现了 error 接口的具体类型 *errorString。
3.2 Is
简介
errors.Is 函数是一个用于错误处理的核心工具,用于检查错误链(error chain)中是否存在某个特定的错误实例。
它是 Go 1.13 版本引入的错误处理增强功能之一,与 errors.As 和 errors.Unwrap 共同提供了更灵活的错误处理机制。
函数签名
func Is(err, target error) bool
- err: 要检查的错误。
- target: 我们想要确认的错误。
- 返回值: 如果错误链中任一错误与目标错误相同,则返回 true。
核心功能
- 递归解包错误链errors.Is 会通过 Unwrap() 或Unwrap() []error方法逐层解包错误链,检查每一层错误是否与 target 匹配。
- 值相等性检查检查错误的“值”是否与 target 相等。默认使用 == 操作符比较,但若错误类型实现了 Is(error) bool 方法,则优先调用该方法进行判断(允许自定义相等逻辑)。
- 支持自定义错误匹配逻辑如果自定义错误类型需要定义特殊的相等规则(例如比较结构体字段而非指针地址),可以实现 Is(error) bool 方法。
示例代码
package mainimport ("errors""fmt"
)var ErrNotFound = errors.New("not found")func main() {err := fmt.Errorf("context: %w", ErrNotFound)if errors.Is(err, ErrNotFound) {fmt.Println("错误链中包含 ErrNotFound")}errNotFoundNew := errors.New("not found")fmt.Println(errors.Is(errNotFoundNew, ErrNotFound)) // false
}
运行输出:
错误链中包含 ErrNotFound
false
因为 err 是基于 ErrNotFound 包装出来的,所以 Is 判断返回 true。
因为 errNotFoundNew 是一个新的 error,虽然错误内容与 ErrNotFound 相同,但是二者是两个独立的 error 对象,所以 Is 判断返回 false。
使用场景
- 检查预定义错误例如判断错误是否为 io.EOF 或 os.ErrNotExist:
if errors.Is(err, io.EOF) {// 处理文件结束逻辑
}
- 自定义错误匹配当需要根据错误的某些字段(而非指针地址)匹配时,自定义 Is 方法:
type ValidationError struct { Field string }
func (e *ValidationError) Is(target error) bool {t, ok := target.(*ValidationError)return ok && e.Field == t.Field
}
- 处理多层错误链自动遍历包裹错误(如 fmt.Errorf + %w 生成的错误链):
err := fmt.Errorf("layer2: %w", fmt.Errorf("layer1: %w", originalErr))
if errors.Is(err, originalErr) { // 直接检查最底层错误// 匹配成功
}
与 == 操作符的区别:
- 默认行为:如果错误类型未实现 Is 方法,errors.Is 默认使用 == 比较错误值和 target。但对于指针类型的错误(如 &MyError{}),== 比较的是指针地址而非值内容。
- 自定义逻辑:通过实现 Is 方法,可以控制错误的匹配逻辑(如比较结构体字段)。
注意事项
-
优先实现 Is 方法:如果自定义错误需要支持值匹配(而非指针匹配),必须实现 Is 方法。
-
target可以是nil:如果 target 为 nil,errors.Is 仅在 err 也为 nil 时返回 true。
-
性能错误链较长时,递归解包可能导致轻微性能开销,但通常可忽略。
小结
errors.Is 是 Go 错误处理的基石之一,它通过递归解包错误链,提供了一种安全、统一的方式来检查特定错误的存在。结合以下实践可最大化其效用:
- 对需要值匹配的自定义错误实现 Is 方法。
- 优先使用 errors.Is 而非 == 直接比较错误(确保兼容错误链)。
- 与 errors.As 分工:Is 用于值匹配,As 用于类型提取。
3.3 As
简介
Golang 中的 errors.As 函数是一个用于错误处理的重要工具,它提供了一种类型安全的方式,用于检查错误树中是否存在某个特定类型的错误,并提取该类型的错误实例。
它是 Go 1.13 引入的错误处理增强功能之一,与 errors.Is 和 errors.Unwrap 共同构成了更灵活的错误处理机制。
函数签名
func As(err error, target any) bool
- err: 要检查的错误树。
- target: 一个指向目标类型的指针,用于存储结果。
- 返回值: 如果错误树中存在指定的类型,则返回 true,并且 target 参数会被设置为相应的错误值。
核心功能
errors.As 会递归遍历错误树(通过 Unwrap() 或 Unwrap() []error 方法解包错误),检查是否存在与 target 类型匹配的错误。如果找到,它会将匹配的错误值赋值给 target,并返回 true。
如果错误的具体值可分配给 target 所指向的值,或者如果错误有一个方法As(any) bool使得As(target)返回true,则错误匹配 target。在后一种情况下,As 方法负责将错误值设置到 target。
与 errors.Is 的区别:
- errors.Is(err, target):检查错误树中是否存在值等于 target 的错误(值比较)。
- errors.As(err, &target):检查错误树中是否存在类型与 target 匹配的错误(类型断言)。
示例代码
package mainimport ("errors""fmt"
)// 自定义错误类型
type MyError struct {Code intMessage string
}func (e *MyError) Error() string {return fmt.Sprintf("code: %d, msg: %s", e.Code, e.Message)
}func main() {err := &MyError{Code: 404, Message: "Not Found"}wrappedErr := fmt.Errorf("wrapper: %w", err) // 包裹错误var myErr *MyErrorif errors.As(wrappedErr, &myErr) {fmt.Println("Found MyError:", myErr.Code, myErr.Message)// 输出: Found MyError: 404 Not Found}
}
在这个例子中:
- 自定义错误类型 MyError 实现了 error 接口。
- 通过 fmt.Errorf 和 %w 包裹原始错误,形成错误树。
- errors.As 检查包裹后的错误树,找到 MyError 类型的错误实例,并将其赋值给 myErr。
使用场景
-
提取特定错误类型的详细信息当错误类型包含额外字段(如错误码、上下文信息)时,可以通过 errors.As 提取这些信息。
-
处理标准库中的错误类型例如,检查一个错误是否是 os.PathError 类型,以获取文件路径相关的详细信息:
var pathErr *os.PathError
if errors.As(err, &pathErr) {fmt.Println("Failed at path:", pathErr.Path)
}
- 多层级错误解包无需手动调用 Unwrap() 遍历错误链,errors.As 会自动处理嵌套错误。
注意事项
- target 必须是指针target 必须是一个指向接口或具体类型的指针。例如:
var target *MyError // 正确(具体类型指针)
var target error = &MyError{} // 正确(接口类型指针)
-
类型必须匹配target 的类型需要与错误链中某个错误的具体类型完全一致(或接口类型)。
-
性能如果错误树非常长,errors.As 可能需要遍历整个树,但实际场景中性能影响通常可忽略。
小结
errors.As 是 Go 错误处理中类型断言的最佳实践,它简化了从错误链中提取特定类型错误的操作。结合 errors.Is 和错误包裹(fmt.Errorf + %w),可以构建清晰、可维护的错误处理逻辑。
3.4 Unwrap
简介
errors.Unwrap 是 Go 1.13 引入的错误处理函数,用于获取被包装(wrapped)错误的原始错误。它是 Go 错误处理机制中错误链(error chain)支持的核心部分。
函数签名
func Unwrap(err error) error
- 解包错误:如果 err 实现了 Unwrap() error 方法,则返回该方法的结果。
- 无包装时:如果错误不支持解包或已经是底层错误,返回 nil。
- 简单直接:仅解包一层,不会递归解包整个错误链。
核心功能
- 解包错误链用于从包裹错误(如通过 fmt.Errorf 和 %w 生成的错误)中提取下一层错误。
- 支持自定义错误类型若自定义错误类型实现了 Unwrap() error 方法,errors.Unwrap 可自动调用它来解包错误。
使用示例
err := fmt.Errorf("wrapper: %w", io.EOF)unwrapped := errors.Unwrap(err)
fmt.Println(unwrapped == io.EOF) // 输出: true
fmt.Println(unwrapped) // 输出: EOF
errors.Unwrap 通常与 fmt.Errorf 的 %w 动词配合使用:
func process() error {if err := step1(); err != nil {return fmt.Errorf("step1 failed: %w", err)}// ...
}err := process()
if errors.Unwrap(err) != nil {// 处理原始错误
}
- 标准接口:要求被解包的错误实现 Unwrap() error 方法
- 非递归:只解包一层,要解包整个错误链需要循环调用
- 与 errors.Is/As 配合:errors.Is 和 errors.As 内部会自动处理错误链
使用场景
- 逐层检查错误链通过循环调用 errors.Unwrap 遍历所有嵌套错误:
currentErr := err
for currentErr != nil {fmt.Println(currentErr)currentErr = errors.Unwrap(currentErr)
}
-
结合 errors.Is** 和 **errors.As虽然 errors.Is 和 errors.As 会自动遍历错误链,但在需要手动提取特定层级错误时,可用 Unwrap 配合使用。
-
自定义错误类型的分层处理为自定义错误实现 Unwrap() 方法,使其能融入错误链机制。
注意事项
-
仅解包一层每次调用 errors.Unwrap 只返回直接包裹的下层错误。需循环调用以遍历整个链。
-
依赖 Unwrap() 方法只有实现了 Unwrap() error 方法的错误才能被正确解包。例如:
- fmt.Errorf 使用 %w 包裹的错误会自动实现此方法。
- 自定义错误需显式实现 Unwrap() error。
- 空值处理如果 err 为 nil,或未实现 Unwrap,或 Unwrap 返回 nil,则函数返回 nil。
小结
errors.Unwrap 是处理错误链的基础工具,适用于需要手动逐层解包错误的场景。结合 errors.Is 和 errors.As 可以实现更高效和安全的错误检查。在实际开发中,优先使用 errors.Is 和 errors.As 来操作错误链,仅在需要直接访问特定层级错误时使用 errors.Unwrap。
3.5 Join
简介
Golang 中的 errors.Join 函数是 Go 1.20 版本引入的一个错误处理工具,用于将多个错误合并为一个包装错误(wrapped error)。
它特别适用于需要同时处理多个错误(例如并发操作中多个协程返回错误)的场景。
函数签名
func Join(errs ...error) error
- 参数 errs …error:一个可变参数列表,接收多个 error 类型的值。
- 返回值 如果输入的 errs 中存在至少一个非 nil 的错误,则返回一个合并后的包装错误;否则返回 nil。
核心功能
- 合并多个错误errors.Join 会将所有非 nil 的错误合并为一个包装错误。合并后的错误可以通过 errors.Unwrap 获取所有原始错误的切片。
- 兼容 errors.Is和 errors.As合并后的错误支持通过 errors.Is 和 errors.As 检查或提取其中的特定错误。例如:
- errors.Is(err, target):如果合并后的错误链中存在与 target 匹配的错误,返回 true。
- errors.As(err, &target):可以提取合并错误链中的第一个匹配类型的错误。
- 错误信息拼接合并后的错误信息是多个原始错误信息的拼接,以换行符分隔。例如:
err1 := errors.New("error 1")
err2 := errors.New("error 2")
joinedErr := errors.Join(err1, err2)
fmt.Println(joinedErr)
// 输出:
// error 1
// error 2
示例代码
package mainimport ("errors""fmt""io/fs""os"
)func main() {err1 := errors.New("file not found")// 创建一个 fs.PathError 错误pathErr := &fs.PathError{Op: "open",Path: "/etc/passwd",Err: os.ErrPermission,}err2 := fmt.Errorf("operation failed: %w", pathErr)// 合并多个错误joinedErr := errors.Join(err1, err2)// 打印合并后的错误信息fmt.Println("Joined error:")fmt.Println(joinedErr)// 检查是否包含特定错误if errors.Is(joinedErr, err1) {fmt.Println("Found 'file not found' error")}// 提取错误链中的某个类型var targetErr *fs.PathErrorif errors.As(joinedErr, &targetErr) {fmt.Println("Found PathError:", targetErr)}
}
运行输出:
Joined error:
file not found
operation failed: open /etc/passwd: permission denied
Found 'file not found' error
Found PathError: open /etc/passwd: permission denied
使用场景
- 并发操作中的错误收集在多个协程并发执行时,可以使用 errors.Join 收集所有协程返回的错误:
func processTasks(tasks []Task) error {var wg sync.WaitGroupvar mu sync.Mutexvar errs []errorfor _, task := range tasks {wg.Add(1)go func(t Task) {defer wg.Done()if err := t.Run(); err != nil {mu.Lock()errs = append(errs, err)mu.Unlock()}}(task)}wg.Wait()return errors.Join(errs...)
}
- 批量操作中的错误汇总例如,处理多个文件或请求时,统一返回所有错误:
func batchProcess(files []string) error {var errs []errorfor _, file := range files {if err := processFile(file); err != nil {errs = append(errs, fmt.Errorf("process %s: %w", file, err))}}return errors.Join(errs...)
}
- 兼容已有错误处理逻辑合并后的错误仍然可以被 errors.Is 和 errors.As 处理,无需修改现有代码。
注意事项
-
Go 版本要求errors.Join 仅在 Go 1.20 及以上版本可用。
-
空参数处理如果所有输入错误均为 nil,errors.Join 返回 nil。
-
错误解包使用 errors.Unwrap 解包合并后的错误时,会返回一个 []error 切片(包含所有非 nil 错误)。
-
错误顺序合并后的错误顺序与输入参数的顺序一致,但 errors.Is 和 errors.As 会按顺序检查所有错误。
小结
errors.Join 提供了一种简洁的方式将多个错误合并为一个,特别适用于需要汇总多个错误信息的场景(如并发编程或批量处理)。通过结合 errors.Is 和 errors.As,可以灵活地检查或提取合并后的错误链中的特定错误。它是 Go 错误处理工具箱中的重要补充,进一步提升了错误管理的便利性。
4.小结
errors 包是 Go 语言标准库中用于错误处理的核心包,随着 Go 版本的演进,它提供了越来越强大的错误处理能力。
以下是主要功能的总结:
- 基础错误创建
- New(text string) error:创建简单的错误对象
- 示例:err := errors.New(“file not found”)
- 错误检查
- Is(err, target error) bool:检查错误链中是否包含特定错误
- 示例:if errors.Is(err, os.ErrNotExist) {…}
- 错误类型提取
- As(err error, target interface{}) bool:从错误链中提取特定类型的错误
- 示例:var perr *fs.PathError; if errors.As(err, &perr) {…}
- 错误包装与解包
- Unwrap(err error) error:解包一层错误
- 通过 fmt.Errorf 的 %w 动词包装错误
- 示例:wrapped := fmt.Errorf(“context: %w”, err)
- 错误组合
- Join(errs …error) error(Go 1.20+):合并多个错误为一个组合错误
- 示例:combined := errors.Join(err1, err2, err3)
errors 包与标准库中的其他错误类型(如 os.PathError、net.OpError 等)配合使用,构成了 Go 强大的错误处理体系。
参考文献
pkg.go.dev/errors
相关文章:
Golang errors 包快速上手
文章目录 1.变量2.类型3.函数3.1 New3.2 Is简介函数签名核心功能示例代码使用场景注意事项小结 3.3 As简介函数签名核心功能示例代码使用场景注意事项小结 3.4 Unwrap简介函数签名核心功能使用示例使用场景注意事项小结 3.5 Join简介函数签名核心功能使用场景注意事项小结 4.小…...
新型多机器人协作运输系统,轻松应对复杂路面
受到鱼类、鸟类和蚂蚁等微小生物体协作操纵的启发,研究人员开发了多机器人协作运输系统(Multirobot Cooperative Transportation Systems,MRCTS)运输单个机器人无法处理的重型超大物体,可用于搜救行动、灾难响应、军事…...
易境通国际货代系统:如何解决货代物流行业的棘手难题
国际货代行业作为全球贸易的重要纽带,面临着日益复杂的市场环境和客户需求。然而,随着业务规模的扩张和多变的市场需求,传统的粗放式管理模式逐渐暴露出效率低下、成本失控、风险难控等问题。尤其在跨境电商高速发展的背景下,货代…...
基于springboot医药连锁店管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统医药连锁店管理采取了人工的管理方法&…...
Vue 3 reactive 和 ref 区别及 失去响应性问题
在 Vue 3 中,reactive 和 ref 是实现响应式数据的两个核心 API,它们的设计目标和使用场景有所不同。以下是两者的详细对比: 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理(对象、数组、Map 等)…...
d3.js绘制单/多面板组合箱线图
用d3.js研发了个可以单面板、多面板展示的组合箱线图; 组合箱线图中包括普通散点、蜂群散点、小提琴图、小提琴箱线图、柱状图、误差棒、离群点等等,其中大部分你能想到的配置都是自行传参调整的,你想不到的也能稍作修改然后自行调整&#x…...
第二十四天 - 分布式任务队列 - Celery高级应用 - 练习:分布式监控任务系统
一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...
IDEA使用jclasslib Bytecode Viewer查看jvm字节码
学习jvm的时候,想查看字节码和局部变量表,可以使用idea安装jclasslib Bytecode View插件查看。 (1)安装工具: 安装完成后需要重启idea. (2)准备一段代码,编译运行 package com.te…...
list.
列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储个元素 在 Redis 中,可以对列表两端插入(push)和弹出(pop),…...
202520读书笔记|《我要按自己喜欢的方式去生活》——面对可能到来的裁员,那就等正式通知吧
《我要按自己喜欢的方式去生活》作者宝夏夏,很赞的一本书,通透真实,不矫揉造作,直击内心。 因为第一个故事,裁员而进来的。早晨睡眼惺忪醒来,闺蜜半夜发来一大段话,大意是公司在缩减成本裁员&am…...
Linux 文件传输:系统数据交互的动脉
前言:sshd 在Linux系统中,文件传输常依赖于SSH协议(Secure Shell),而sshd(OpenSSH Daemon)是负责处理SSH连接的后台服务程序。通过sshd,用户可以在加密的通道中进行安全的远程登录、…...
Rust + WebAssembly 生产部署指南
1 最小可行部署(MVP) 前端打包wasm-pack build --target web --release # 生成 .wasm JS 包装器 npm run build / vite build / webpack … # 打包 HTML/CSS/JS 资源拷贝产物 到生产服务器的站点目录dist/ ├── index.html ├── pkg…...
git忽略已跟踪的文件/指定文件
在项目开发中,有时候我们并不需要git跟踪所有文件,而是需要忽略掉某些指定的文件或文件夹,怎么操作呢?我们分两种情况讨论: 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…...
基于Django实现的图书分析大屏系统项目
图书分析大屏展示系统项目大纲与启动教程 一、项目概述 图书分析大屏展示系统是一个基于Django框架开发的Web应用,主要用于图书数据的可视化分析与展示。该系统采用MVT(Model-View-Template)架构模式,结合MySQL数据库࿰…...
【OSCP-vulnhub】GoldenEye
目录 端口扫描 查找源代码 目录扫描 POP3邮件枚举 1.先枚举用户名 2.hydra爆破 3.nc连接 boris: natalya: 设置本地hosts文件 doak: 解析图片 exiftool for-007.jpg strings for-007.jpg 使用MSF去搜索内核版本 漏洞利用 ---…...
OpenAI发布GPT-4.1系列模型,主打编程能力提升
OpenAI在本周一推出了全新一代模型家族——GPT-4.1系列。没错,就是“4.1”,尽管OpenAI的命名方式已经让人有些摸不着头脑。 这一系列包括三个型号:GPT-4.1、GPT-4.1 mini和GPT-4.1 nano。据OpenAI介绍,这些模型在编程任务和指令遵…...
压缩包网页预览(zip-html-preview)
zip-html-preview 项目介绍 这是一个基于 Spring Boot 开发的在线 ZIP 文件预览工具,主要用于预览 ZIP 压缩包中的 HTML 文件及其相关资源。 主要功能 支持拖拽上传或点击选择多个 ZIP 文件自动解压并提取 ZIP 文件中的 HTML 文件在线预览 HTML 文件及其相关的 CSS、JavaSc…...
OpenCV 图形API(41)颜色空间转换----- BGR 图像转换为灰度图像函数BGR2Gray()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从BGR色彩空间转换为灰度。 B、G和R通道值的传统范围是0到255。结果的灰度颜色值计算为: dst ( I ) 0.114 ∗ src ( I ) . B…...
影视产业链中的律师角色以及合规风控要点
影视产业链中的律师角色以及合规风控要点 在影视娱乐业务中,律师服务贯穿项目全生命周期,涵盖创意开发、投z制作、发行传播、艺人管理及争议等多个领域 一、影视项目全流程合同法律事务 ✔️项目开发阶段 剧本合作:剧本委托创作、改编、版权…...
Java工具类——实体类列表写入excel
Java工具类——实体类列表写入excel /*** 将实体类 List 数据写入 Excel 文件* param dataList 实体类对象列表* param filePath Excel 文件路径* param sheetName Sheet 名称* param <T> 泛型类型* throws IOException 文件操作异常* throws IllegalAccessException 反…...
C++23 新预处理器指令详解:#elifdef、#elifndef 和 #warning
文章目录 1. #elifdef 和 #elifndef:更灵活的条件编译1.1 背景与动机1.2 语法与示例示例代码: 1.3 编译器支持 2. #warning:发出编译警告2.1 背景与动机2.2 语法与示例示例代码: 2.3 编译器支持 3. 总结 C23 标准引入了多项改进&a…...
书写API文档的最佳实践[特殊字符]
API文档对于API的可用性和成功至关重要。完善的API文档能显著提高开发者体验,加速采用,并培养强大的开发者社区。反之,糟糕的文档可能导致困惑、挫败感和错误,从而降低采用率。本文将探讨编写清晰、全面、开发者友好的API文档的高…...
【Maven】手动安装依赖到本地仓库
【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖,中央仓库地址:https://mvnrepository.com/ 搜搜你的依赖的a…...
kali下maven 的安装与配置
1、下载 maven 安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 2、解压 apache-maven-3.9.4-bin.tar.gz tar -zxvf apache-maven-3.9.4-bin.tar.gz 找到文件解压到的位置,由于解压时我们没有指定路径&#x…...
list的模拟实现和反向迭代器的底层
1:list的模拟实现 1:链表的节点 对于list的模拟实现,我们需要先定义一个节点的类可以使用(class也可以使用struct) // List的节点类 template<class T> struct ListNode {ListNode(const T& val T()){_p…...
OpenHarmony - 小型系统内核(LiteOS-A)(七)
OpenHarmony - 小型系统内核(LiteOS-A)(七) 八、文件系统 适配新的文件系统 基本概念 所谓对接VFS层,其实就是指实现VFS层定义的若干接口函数,可根据文件系统的特点和需要适配其中部分接口。一般情况下&…...
四层板的时钟线设计:关键要点与实用策略
在电子电路设计领域,四层板凭借其出色的电气性能和合理的空间布局,广泛应用于各类电子产品中。而时钟线作为系统的 “心跳”,为整个电路提供同步信号,其设计质量直接关系到系统的稳定性、可靠性和性能表现。因此,深入探…...
【TypeScript类型系统解析:一次真实的类型检查修复经历】
TypeScript类型系统解析:一次真实的类型检查修复经历 在最近的管理系统开发过程中,我遇到了一个值得深入探讨的TypeScript类型问题。通过解决这个问题,我更深入地理解了TypeScript的类型系统工作原理,以及如何在Vue项目中正确处理…...
全视通无感护理巡视系统方案及产品,助力医院护士巡视病房到位
传统的护理工作中,护理巡视是一项重要且繁琐的任务。护士们需要根据不同的护理级别,定时对患者进行巡视,并手工填写巡视记录表,登记巡视时间、人员等信息。月末时,还需进行人工数据统计,这一过程不仅效率低…...
初识Redis · 命令、数据结构补充、协议
目录 前言: 数据结构补充 stream geospaital Hyperloglog bitmap bitfield 渐进式遍历命令等 认识Redis客户端及协议 前言: 在前文,我们总览一下,我们已经介绍了什么是Redis,Redis的应用场景是什么ÿ…...
DBA工作常见问题整理
MVCC机制: PostgreSQL的多版本并发控制(MVCC)是其核心特性之一,它允许数据库在高并发环境下保持高性能的同时提供事务隔离。 MVCC通过维护数据的多个版本实现: 读操作不阻塞写操作写操作不阻塞读操作避免使用锁实现并发控制 PostgreSQL的MVCC特点 写时…...
云转型(cloud transformation)——不仅仅是简单的基础设施迁移
李升伟 编译 云转型不仅仅是迁移基础设施,更是重塑企业运营、创新及价值交付的方式。它具有战略性、持续性,并影响着人员、流程和平台。 ☁️ 云转型涉及以下内容: 🔄 应用现代化——从单体架构转向微服务架构。 ⚙️ 运营自动…...
SpringBoot 定时任务
启用定时任务 首先确定需要启用定时任务的SpringBoot类,然后添加注解(EnableScheduling)以启用定时任务 package com.mt.visitorauth.anjian.service;import org.springframework.scheduling.annotation.EnableScheduling;EnableScheduli…...
常见的低代码策略整理
低代码策略通过简化开发流程、降低技术门槛、提升效率,帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面: 快速交付与降本增效 减少编码需求:通过可视化配置(如变量替换、表达式函数)替代传统编码…...
HFSS(李明洋)学习记录1
Hfss操作记录 HFSS—solution type:选择求解类型Modeler—units:设置hfss内部的基本单位可选mm或者in(英寸)设置端口激励—波端口:右键selection model/face 选中对应的表面之后;右键assign excitation/po…...
泛目录站群技术架构演进观察:2025年PHP+Java混合方案实战笔记
https://www.zhanqun.xin/ 在参与某跨国电商平台SEO优化项目时,我们团队对市面上主流站群系统进行了为期半年的技术评估。最终选择部署的2025版无极多功能泛目录站群程序,其技术实现路径与工程化设计思路颇具参考价值,现整理关键发现如下。 …...
sentinel安装部署及测试--实践
一、什么是 Sentinel? Sentinel 是阿里巴巴开源的一款用于微服务流量控制和系统防护的中间件。它的主要功能包括: **流量控制(Flow Control):**限制系统的 QPS 或线程数,防止因流量过大导致系统崩溃。 **…...
Yocto项目实战教程 · 第4章:4.1小节元数据
🔍 B站相应的视频教程: 📌 Yocto项目实战教程-第4章-4.1小节-元数据 记得三连,标为原始粉丝。 在嵌入式Linux系统构建中,Yocto项目凭借其高度模块化、可配置的特性成为主流工具。而其背后的关键支撑之一,便…...
应用镜像是什么?轻量应用服务器的镜像大全
应用镜像是轻量应用服务器专属的,镜像就是轻量应用服务器的装机盘,应用镜像在原有的纯净版操作系统上集成了应用程序,例如WordPress应用镜像、宝塔面板应用镜像、WooCommerce等应用,阿里云服务器网aliyunfuwuqi.com整理什么是轻量…...
关于Java集合中对象字段的不同排序实现方式
📊 关于Java集合中对象字段的不同排序实现方式 #Java集合 #排序算法 #Comparator #性能优化 一、排序基础:两种核心方式对比 方式Comparable接口Comparator接口实现位置目标类内部实现独立类或匿名内部类排序逻辑自然排序(固定规则…...
2000-2017年各省发电量数据
2000-2017年各省发电量数据 1、时间:2000-2017年 2、来源:能源年鉴、国家统计局 3、指标:行政区划代码、城市、年份、发电量 4、范围:31省 5、指标说明:发电量是指在特定时间内,发电设备(如…...
第二十二天 - 安全加固实践 - 漏洞扫描工具开发 - 练习:SSH暴力破解防护
前言 随着网络安全威胁日益严峻,掌握基础防护技能成为开发者必备能力。本文将从零开始,通过安全加固实践、漏洞扫描工具开发、SSH暴力破解防护三个维度,带您快速构建安全防御体系。所有示例均附带完整代码,建议边阅读边实践。 一…...
【AI】React Native中使用Zustand框架及自动生成选择器
引言 随着React Native在移动应用开发领域的广泛应用,高效的状态管理变得尤为重要。Zustand作为一个轻量级的状态管理库,提供了简洁而强大的API,特别适合于React Native应用开发。本报告将详细介绍如何在React Native项目中使用Zustand框架&…...
MySQL GTID集合运算函数总结
MySQL GTID 有一些运算函数可以帮助我们在运维工作中提高运维效率。 1 GTID内置函数 MySQL 包含GTID_SUBSET、GTID_SUBTRACT、WAIT_FOR_EXECUTED_GTID_SET、WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS 4个内置函数,用于GTID集合的基本运算。 1.1 GTID_SUBSET(set1,set2) …...
4.1.2 Redis协议与异步方式
文章目录 4.1.2 Redis协议与异步方式1. redis pipeline2. redis事务1. MULTI2. EXEC3. DISCARD4. WATCH 3. lua脚本1. lua基础语法2. Lua 脚本中访问 Redis 的方式3. Lua 脚本中的 KEYS 和 ARGV4、返回值5、错误处理EVALSHA 来代替 EVAL 4. ACID特性分析5. redis发布订阅1. 工作…...
ecovadis审核有什么原则?什么是ecovadis审核,有什么意义
EcoVadis审核概述 EcoVadis是一家全球知名的企业可持续发展评级机构,成立于2007年,旨在通过评估企业的环境(E)、社会(S)和治理(G)表现,帮助跨国公司管理供应链的可持续性…...
bitnet-b1.58-2B-4T和三进制
最近有个模型挺火啊现在都排进了HF排行榜的第四了 模型叫做microsoft/bitnet-b1.58-2B-4T 其实非常小的一个模型,只有2B,那这东西有多大意义呢? 它主要探索一个打法 也就是这篇论文 The era of 1-bit llms: All large language models ar…...
k8s报错kubelet.go:2461] “Error getting node“ err=“node \“k8s-master\“ not found“
问题 首先最初问题: [rootk8s-master ~]# kubectl get pods -owide --all-namespaces The connection to the server 192.168.2.129:6443 was refused - did you specify the right host or port?检查kubelet状态 查看kubelet status报找不到master节点 [rootk8…...
计算serise数据的唯一值数量
1. Series.unique() 功能:返回 Series 中所有唯一值的 数组(顺序按首次出现排列)。 返回值类型:numpy.ndarray(用户可能误认为是列表,但实际是 NumPy 数组)。 对 NaN 的处理:包含 …...
数组理论基础
什么是数组 在Java中,数组是一种数据结构,用来存储同一类型的多个元素。这些元素可以按照索引访问,方便对数据进行操作和管理。数组在编程中应用广泛,是一种基本且重要的数据结构。 数组的基本概念 1. 元素:数组中的…...