Githeb.com/pkg/errors

This is Wrap(err error, msg string) https://pkg.go.dev/Githeb.com/pkg/errors#Wrap

This is WithMessage(err error, msg string) https://pkg.go.dev/Githeb.com/pkg/errors#WithMessage

both of these functions implement the interface causer https://pkg.go.dev/Githeb.com/pkg/errors#Cause

这段代码适用于errors.WithMessage,尽管我认为我应该使用errors.Wrap来表示errors.Cause

func main() {
    err := errors.New("first")
    err1 := errors.WithMessage(err, "tmp")
    err2 := errors.WithMessage(err1, "tmp")
    err3 := errors.WithMessage(err2, "tmp")
    fmt.Printf("%s", errors.Cause(err3))
}

Output: first

推荐答案

不同之处在于Wrap包括一个调用堆栈.如果您单击Go文档中的函数名称,它会将您带到源代码,您可以看到这两个函数都非常简短,并且只有一个不同之处;WithMessage创建了一个带有给定消息和原因(您传入的错误)的新错误,而Wrap接受此错误并将其包装为again:

&withStack{
    err,
    callers(),
}

这里,err是它刚刚创建的新错误(与您从WithMessage得到的完全一样),callers填充一个调用堆栈.文档(重点是我的)中指出了这一点:

在调用Wrap时,WRAP返回错误annotating err with a stack trace

这在WithMessage中没有提到,因为它不是由该函数完成的.

Go相关问答推荐

Go 1.22 net/http群组路由

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

Go GORM创建表,但不创建列

如何存储来自异步Goroutine的返回值列表?

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

CURL和Postman HTTP POST工作,但Golang请求失败,状态为400

golang有int32溢出吗?

如何在S汇编器中更高效地将全局数据加载到霓虹灯寄存器?

为什么标准库中的 IsSorted 会反向迭代切片?

Fizz对Gin的OpenAPI生成器正在重命名类型

Github Actions Go lambda 项目不同的 sha256sums

用于提取 <*n 的正则表达式(其中 n 是一个数字)

从 eBPF LRU 哈希映射中错误驱逐的元素

也许在 golang 中包(字符串和字符串类型不匹配)

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

使用自定义处理程序 nats golang 保留订阅方法

枚举的 Golang 验证器自定义验证规则

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

CORS grpc 网关 GoLang

GORM GIN 更新查询导致 500 内部服务器错误