Go的标准软件包中的这三个功能有什么区别:

  • errors.Wrapf()


  • errors.Errorf() ,通过%w格式变量
  • 提供了错误


  • fmt.Errorf() ,通过%w格式变量
  • 提供了错误



    什么时候应该使用一个代替其他?

    最佳答案

    首先,更正:

    github.com/pkg/errors 不属于标准库!标准的 errors 软件包具有更小的API。

    就是说,github.com/pkg/errors非常流行,并且由一些著名的Gophers维护。但是,Go 1.13's extended error support很大程度上(尽管不是完全*)淘汰了它。

    了解这三个功能之间的区别需要一些历史类(class)。

    在Go 1.13之前,没有官方认可的“包装”错误的方法。 github.com/pkg/errorsWrapWrapf方法填补了这一空白。这样就可以使用其他上下文(包括堆栈跟踪)包装错误,同时以原始格式保留原始错误。

    在开发Go 1.13时,github.com/pkg/errors用于影响新的API,但最终版本略有不同。他们决定使用新的Wrap动词扩展Wrapf方法,而不是fmt.Errorf%w方法,这将为您执行错误包装。

    这意味着以下代码大致*等价:

        import "github.com/pkg/errors"
    
        /* snip */
    
        return errors.Wrapf(err, "bad things")
    
        // +build go1.13
    
        import "fmt"
    
        /* snip */
        return fmt.Errorf("bad things: %w", err)
    

    当Go 1.13发布时,%w动词被添加到fmt.Errorfgithub.com/pkg/errors随之效仿并添加了相同的支持,因此Wrapf实际上已经过时了。

    因此,这为我们带来了当今的建议:
  • 如果您想在错误中使用堆栈跟踪,请使用github.com/pkg/errors.Errorf来包装错误。
  • 如果您不关心堆栈跟踪,请使用标准库中的fmt.Errorf
  • 不再使用errors.Wrapf。这是为了向后兼容。


  • *标准库的error包仍然不包括堆栈跟踪,因此github.com/pkg/errors仍然很受欢迎。

    关于go - errors.Wrapf(),errors.Errorf()和fmt.Errorf()之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61933650/

    10-13 05:36