一篇聊聊Go错误封装机制

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

%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的结果。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2021-04-30 09:04:11

Go 语言结构体type

2023-09-21 08:05:49

Mybatis插件开发

2023-07-31 07:48:43

Java内存虚拟机

2021-08-05 06:54:05

Go切片数据

2021-07-16 22:43:10

Go并发Golang

2021-04-01 10:51:55

MySQL锁机制数据库

2022-05-17 08:02:55

GoTryLock模式

2022-02-23 09:36:11

GoRuby编程语言

2021-06-24 06:35:00

Go语言进程

2021-03-24 06:06:13

Go并发编程Singlefligh

2021-04-29 09:02:44

语言Go 处理

2024-02-22 17:15:22

JS垃圾回收机制

2022-06-09 08:41:17

Go网络库Gnet

2019-07-15 07:58:10

前端开发技术

2022-06-02 07:11:13

JVMJava

2021-11-15 07:47:40

字符串位置存储

2023-12-05 07:14:27

AIGo

2021-11-15 10:29:39

Go语言类型

2021-04-09 10:38:59

Go 语言数组与切片

2023-12-08 08:26:05

数据存储持久性
点赞
收藏

51CTO技术栈公众号