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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:03:22