3 回答
TA贡献1789条经验 获得超8个赞
fmt.Println(s)打印“错误”,因为error在fmt包中是特殊情况
switch v := p.arg.(type) {
case error:
handled = true
defer p.catchPanic(p.arg, verb)
p.printArg(v.Error(), verb, depth)
return
case Stringer:
handled = true
defer p.catchPanic(p.arg, verb)
p.printArg(v.String(), verb, depth)
return
}
}
该fmt包首先检查对象是否为 a Formatter、GoStringer、error或Stringer,以获取要打印的值。
至于你的最后一个问题,你必须使用一个变量,而不仅仅是分配它。打印它们可以消除错误。
TA贡献1797条经验 获得超4个赞
关于你的第一个问题 - 如果你添加fmt.Println(reflect.TypeOf(s))
- 你会看到输出不是Succer
but *main.Combi
。
现在,由于它实现了Error
接口并且Error() string
-Println
认为它是一个错误对象并打印其Error
方法的输出。
将Error
方法更改为任何其他方法将停止Println(s)
打印“错误”。但它也不会打印“成功”。
TA贡献1790条经验 获得超9个赞
在您的第一个问题中,如果您想通过s
调用success
func打印成功:
fmt.Println(s.Success())
关于第二个问题,Go
编译器检查未使用的变量,所以只分配它而不使用它显示编译错误
- 3 回答
- 0 关注
- 189 浏览
添加回答
举报