Go-返回基于字符串的包错误的最佳方法?

Go-返回基于字符串的包错误的最佳方法?,go,error-handling,package,Go,Error Handling,Package,我有一个定义了导出错误的包和一个解析可能包含错误数据的字符串的方法。是否有方法返回与字符串匹配的导出错误?是否只有在开关盒上才能使用 package foobarbaz /* Import */ var ( ErrFoo = errors.New("foo") ErrBar = errors.New("bar") /* More... */ ) func ParseStringWithErr(s string) (string

我有一个定义了导出错误的包和一个解析可能包含错误数据的字符串的方法。是否有方法返回与字符串匹配的导出错误?是否只有在开关盒上才能使用

package foobarbaz

/* Import */

var (
    ErrFoo = errors.New("foo")
    ErrBar = errors.New("bar")
    /* More... */
)

func ParseStringWithErr(s string) (string, error) {
    // Data looks like e.g. "data:foo"
    var result string
    var err error
    result = getResultAsString(s)
    err = errors.New(getErrAsString(s)) // Will be "foo", "bar", etc... as string
    
    return result, err  // DOESN'T WORK
                        // New error won't be equivalent to the exported Errors
}
它实际上比这稍微复杂一些,因为解析后的值存储在一个对象中,然后返回。可能要分析的字符串不包含错误数据,在这种情况下,只是不调用getErrAsString部分(并且err保留其空值
,这是正确的)


很明显,我可以编写一个只打开错误字符串的函数,但是有几个导出的错误,而且必须为每个错误编写一个案例似乎很奇怪。

基本上,您想要的是从字符串中,从错误字符串中查找
错误值

初始化并使用一个简单的映射:

var errMap = map[string]error{}

func init() {
    for _, err := range []error{ErrFoo, ErrBar} {
        errMap[err.Error()] = err
    }
}

func LookupError(s string) (err error, ok bool) {
    err, ok = errMap[s]
    return
}
测试它:

err, ok := LookupError("foo")
fmt.Println(err, ok, err == ErrFoo)

err, ok = LookupError("bar")
fmt.Println(err, ok, err == ErrBar)

err, ok = LookupError("baz")
fmt.Println(err, ok)
哪些输出(在上尝试):

foo-true-true
除非是真的
假的
foo true true
bar true true
<nil> false