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

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


0 无


0 Impl 纵梁类型


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


0 无


0 Impl 错误类型


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))

}


繁星淼淼
浏览 184回答 2
2回答

隔江千里

Packagefmt的文档指出:...特殊格式考虑适用于实现某些接口的操作数。按申请顺序:...如果 %v 动词与 # 标志 (%#v) 一起使用并且操作数实现了 GoStringer 接口,则会调用该接口。如果格式(对于 Println 等隐含 %v)对字符串(%s %q %v %x %X)有效,则适用以下两条规则:如果操作数实现了错误接口,则会调用 Error 方法...如果操作数实现方法 String() 字符串,则将调用该方法...由于您使用fmt.Println,第4和第5开始发挥作用,它更喜欢称Error()在String()

慕田峪4524236

你忽略了你的函数返回的事实fmt.Stringer将所得的值传递给fmt.Println作为interface{}。您看到该Error()方法的结果只是因为fmt包在检查error接口之前检查了fmt.Stringer接口。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go