Go语言中用%e格式化error出现异常输出的原因探究
为什么用
%e格式化Go的error会得到奇怪的输出? 这个输出其实是Go的fmt包在直白地告诉你——你用错格式化动词啦!
先拆解一下你看到的输出&{%!e(string=La de da)}的含义:
&:因为errors.New()返回的是*errors.errorString类型的指针(error是接口,底层指向这个指针实例),所以打印时会显示指针符号。%!e(string=La de da):这是fmt包的错误提示标记:%!e表示你使用了%e这个格式化动词,但对应的参数类型和它完全不匹配;括号里的string=La de da则说明实际传入的参数底层值是字符串类型的"La de da"。
为什么会出现这种情况?
%e是专门给浮点数设计的格式化动词,作用是输出科学计数法格式的数值。而你的err是error接口类型,和浮点数类型完全不搭边,fmt包没办法按照%e的规则处理,就输出了这个带错误提示的特殊格式,帮你快速发现类型不匹配的问题。
正确格式化error的方式
如果你想输出错误信息,应该用这些适配的格式化动词:
%v:默认格式,会调用error的Error()方法,直接输出错误文本:fmt.Printf("%v\n", err)→La de da%s:和%v效果一致,输出错误的字符串内容:fmt.Printf("%s\n", err)→La de da%q:会把错误信息用双引号括起来,适合需要字符串字面量的场景:fmt.Printf("%q\n", err)→"La de da"- 如果想查看error的具体类型,可以用
%T:fmt.Printf("%T\n", err)→*errors.errorString
补充:fmt包的类型不匹配提示机制
这种%!动词(类型=值)的格式是fmt包的通用错误提示逻辑,只要你用了和参数类型不匹配的格式化动词,都会出现类似输出。比如用%d格式化字符串,会得到%!d(string=hello),本质都是在提醒你格式化动词和参数类型不匹配哦。
内容的提问来源于stack exchange,提问作者Alana Storm
相关产品推荐
相关产品推荐

