在下面的代码中,类型ErrNegativeSqrt实现了Stringer和error接口。由于在Sqrt方法中返回类型是fmt.Stringer,所以除了执行结果为:
零零 0脉冲串型
但实际结果如下,为什么?
零零 0驱动错误类型
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))
}发布于 2016-05-05 19:23:18
fmt指出:
..。特殊的格式化注意事项适用于实现某些接口的操作数。按申请顺序: ..。
如果格式(隐式%v表示Println等)对于字符串(%s %q %v %x %X)有效,适用以下两条规则:
由于您使用的是fmt.Println,规则4和规则5起作用,它们更喜欢调用Error()而不是String()
发布于 2016-05-05 19:23:29
您忽略了这样一个事实,即您的函数通过将结果值作为fmt.Stringer传递给fmt.Println来返回interface{}。
您只会看到Error()方法的结果,因为fmt包在检查fmt.Stringer接口之前检查了error接口。
https://stackoverflow.com/questions/37058057
复制相似问题