Go语言错误字符串的不可变更性保障程度有多大?
核心结论
关于错误字符串的可信度
完全不能信任错误字符串的稳定性,绝对不要用错误字符串匹配做业务逻辑判断,原因有三点:
- Go官方从未对标准库输出的错误文本做向后兼容承诺,版本迭代中随时可能调整措辞、增减标点
- 依赖系统调用产生的错误会跟随操作系统的本地化设置返回对应语言的文本,中文系统下你匹配的英文错误串会完全失效
- 不同操作系统的原生错误提示本身存在差异,Windows、Linux、macOS返回的同一场景错误文本没有统一标准
关于errors.Is()的认知纠正
你对errors.Is()的理解完全错误,它的底层实现完全不依赖字符串比较:它会遍历错误链,判断目标错误是否和链中的某个错误值相等,或者对应错误实现的Is(error) bool方法返回true,全程不会读取错误的Error()方法返回的文本内容,是Go 1.13+推荐的标准错误判断方式。
你的场景的正确实现
对于os包的文件操作错误,标准库已经封装了现成的判断方法,不需要手动处理错误内容:
package main import ( "fmt" "os" ) func main() { err := os.Mkdir("test", 0644) if err != nil { fmt.Printf("error: %v\n", err) // 直接用标准库提供的判断方法即可 if os.IsExist(err) { // 等价写法:if errors.Is(err, os.ErrExist) fmt.Printf("the dir already exists\n") } else { panic(err) } } }
你提到的类型判断模式在标准库中已经有对应实现,除了os.IsExist之外,还有os.IsNotExist、os.IsPermission等封装函数,如果你需要自定义错误场景,也可以通过定义哨兵错误、自定义错误类型结合errors.Is/errors.As实现类型安全的错误判断,全程不需要触碰错误字符串。
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

