为何Go打印Error方法结果而非String方法的预期输出?
Go中fmt.Println优先调用Error()而非String()的问题
代码示例
package main import ( "fmt" "time" ) type MyStruct struct { When time.Time What string } func (e MyStruct) Error() string { return fmt.Sprintf("######### %v, %s", e.When, e.What) } func (e MyStruct) String() string { return fmt.Sprintf("******** %v", e.When) } func run() MyStruct { return MyStruct{ time.Now(), "it didn't work", } } func main() { obj := run() fmt.Println(obj) }
预期输出
******** 2009-11-10 23:00:00 +0000 UTC m=+0.000000001
实际输出
######### 2009-11-10 23:00:00 +0000 UTC m=+0.000000001, it didn't work
原因与解决办法
Go的fmt包有明确输出规则:当一个值同时实现error接口(具备Error() string方法)和Stringer接口(具备String() string方法)时,输出函数会优先调用Error()方法,而非String()。你的MyStruct刚好同时实现了这两个接口,所以输出结果走了Error()的逻辑。
要得到预期输出,有几种方式可选:
- 若无需将
MyStruct作为错误类型使用,直接删除Error()方法; - 必须保留
Error()的话,输出时显式调用String():fmt.Println(obj.String()); - 或者将值转换为
fmt.Stringer类型后输出:fmt.Println(fmt.Stringer(obj))。
内容的提问来源于stack exchange,提问作者atiq1589
相关产品推荐
相关产品推荐

