在下面的代码中,类型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
的文档指出:
...特殊格式考虑适用于实现某些接口的操作数。按申请顺序:
...
如果 %v 动词与 # 标志 (%#v) 一起使用并且操作数实现了 GoStringer 接口,则会调用该接口。
如果格式(对于 Println 等隐含 %v)对字符串(%s %q %v %x %X)有效,则适用以下两条规则:
如果操作数实现了错误接口,则会调用 Error 方法...
如果操作数实现方法 String() 字符串,则将调用该方法...
由于您使用fmt.Println
,第4和第5开始发挥作用,它更喜欢称Error()
在String()
慕田峪4524236
TA贡献1875条经验 获得超5个赞
你忽略了你的函数返回的事实fmt.Stringer
将所得的值传递给fmt.Println
作为interface{}
。
您看到该Error()
方法的结果只是因为fmt
包在检查error
接口之前检查了fmt.Stringer
接口。
- 2 回答
- 0 关注
- 183 浏览
添加回答
举报
0/150
提交
取消