首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >困惑:在Go中实现多个接口

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

Stack Overflow用户
提问于 2016-05-05 18:46:47
回答 2查看 889关注 0票数 1

在下面的代码中,类型ErrNegativeSqrt实现了Stringererror接口。由于在Sqrt方法中返回类型是fmt.Stringer,所以除了执行结果为:

零零 0脉冲串型

但实际结果如下,为什么?

零零 0驱动错误类型

代码语言:javascript
复制
package main

import (
    "fmt"
)

type ErrNegativeSqrt float64

func 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))
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-05 19:23:18

fmt指出:

..。特殊的格式化注意事项适用于实现某些接口的操作数。按申请顺序: ..。

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

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

  1. 如果操作数实现了错误接口,则将调用错误方法.
  2. 如果操作数实现方法String()字符串,该方法将被调用.

由于您使用的是fmt.Println,规则4和规则5起作用,它们更喜欢调用Error()而不是String()

票数 5
EN

Stack Overflow用户

发布于 2016-05-05 19:23:29

您忽略了这样一个事实,即您的函数通过将结果值作为fmt.Stringer传递给fmt.Println来返回interface{}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37058057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档