一篇聊聊Go错误封装机制
创始人
2025-06-28 07:40:35
0

%w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。

使用 %w 时,它会在格式化字符串中占据一个位置,并将其后的错误作为参数传递给 fmt.Errorf 或 fmt.Sprintf 函数。这将创建一个新的错误,包含了原始错误信息,并形成一个错误链。

下面是一个示例,展示了如何使用 %w 来进行错误包装:

package main

import (
	"errors"
	"fmt"
)

func doSomething() error {
	return errors.New("something went wrong")
}

func main() {
	err := doSomething()

	// Wrap the original error with additional context
	wrappedErr := fmt.Errorf("encountered an issue: %w", err)

	fmt.Println(wrappedErr) // Output: encountered an issue: something went wrong
	if err, ok := wrappedErr.(interface{ Unwrap() error }); ok {
		// wrappedErr是error类型,只支持Error()方法,所以没办法直接调用Unwrap()。但是wrappedErr.(interface{ Unwrap() error })取出内部的数据就可以调用Unwrap()了
		fmt.Println("internal error:", err.Unwrap())
	}
	fmt.Println(errors.Is(wrappedErr, err))                         // Output: true
	fmt.Println(errors.Is(err, fmt.Errorf("something went wrong"))) // Output: false
}

另外,还有一种interface{ Unwrap() []error },其实是多次用了%w的结果。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...