You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:31:45