为了账号安全,请及时绑定邮箱和手机立即绑定

困惑:在 Go 中实现多个接口

困惑:在 Go 中实现多个接口

Go
繁星淼淼 2022-01-10 10:56:01
在下面的代码中,类型ErrNegativeSqrt实现了Stringer和error接口。由于在Sqrt方法中返回类型是fmt.Stringer,我会除了执行结果是:0 无0 Impl 纵梁类型但实际结果如下,为什么呢?0 无0 Impl 错误类型package mainimport (    "fmt")type ErrNegativeSqrt float64func Sqrt(x ErrNegativeSqrt) (float64, fmt.Stringer) {    if x < 0 {        return 0, ErrNegativeSqrt(x)    }    return 0, nil}func (e ErrNegativeSqrt) String() string {    return "Impl Stringer type"}func (e ErrNegativeSqrt) Error() string {    return "Impl error type"}func main() {    fmt.Println(Sqrt(2))    fmt.Println(Sqrt(-2))}
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

Packagefmt文档指出:

...特殊格式考虑适用于实现某些接口的操作数。按申请顺序:

...

  1. 如果 %v 动词与 # 标志 (%#v) 一起使用并且操作数实现了 GoStringer 接口,则会调用该接口。

如果格式(对于 Println 等隐含 %v)对字符串(%s %q %v %x %X)有效,则适用以下两条规则:

  1. 如果操作数实现了错误接口,则会调用 Error 方法...

  2. 如果操作数实现方法 String() 字符串,则将调用该方法...

由于您使用fmt.Println,第4和第5开始发挥作用,它更喜欢称Error()String()


查看完整回答
反对 回复 2022-01-10
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

你忽略了你的函数返回的事实fmt.Stringer将所得的值传递给fmt.Println作为interface{}

您看到该Error()方法的结果只是因为fmt包在检查error接口之前检查了fmt.Stringer接口。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信