go - 无法模仿Golang的错误界面
问题描述
我试图在类似的代码中模仿错误发生的事情,第一段代码打印---日志第二个不为什么呢?或者换句话说,我试图了解如何在没有显式调用的情况下调用 Error() 方法。
package main
import (
"fmt"
)
type argError struct {
arg int
prob string
}
func (e *argError) Error() string {
return fmt.Sprintf("%d ---- %s", e.arg, e.prob)
}
func f2(arg int) (int, error) {
return -1, &argError{arg, "can't work with it"}
}
func main() {
a,b := f2(42)
fmt.Println(a)
fmt.Println(b)
}
package main
import (
"fmt"
)
type myerr interface {
Apple() string
}
type dummy struct {
age int
name string
}
func (d *dummy) Apple() string {
return fmt.Sprintf("%d --- %s", d.age, d.name)
}
func f1(arg int) (string, myerr) {
return "f1", &dummy{arg, "ret"}
}
func main() {
i, j := f1(42)
fmt.Println(i)
fmt.Println(j)
}
解决方案
为了让它工作,你的类型必须error
通过一个Error
方法来实现接口。我建议将您的myerr
界面调整为 embed error
,如下所示:
package main
import (
"fmt"
)
type myerr interface {
error // <--- note: embedding 'error' here
Apple() string
}
type dummy struct {
age int
name string
}
func (d *dummy) Apple() string {
return fmt.Sprintf("%d --- %s", d.age, d.name)
}
// <--- note: implement the 'error' interface for the 'dummy' type
func (d *dummy) Error() string {
return fmt.Sprintf("%d ---- %s", d.age, d.name)
}
func f1(arg int) (string, myerr) {
return "f1", &dummy{arg, "ret"}
}
func main() {
i, j := f1(42)
fmt.Println(i)
fmt.Println(j)
}
这应该调用你所期望的Error
方法。j
您可以在 Go 操场上试一试。
推荐阅读
- sql - 选择转换为 xml 的行
- excel-formula - 单元格格式是否可以对单元格内容执行公式?
- scala - 如何使用akka类型在akka流中使用ActorSink.actorRefWithBackpressure
- android - 嵌套在我的抽屉导航器中的重置堆栈
- javascript - AssertionError:无法比较节点 js 中的两个对象
- django - .objects.filter(name__containe=data) 的返回结果格式,不带引号
- python - django 中 DateTimeField 的默认日期和时间
- asp.net-core-mvc - DropzoneJS 上传 200+MB 文件为空
- ios - 我可以通过在同一设备上的 xcode 中运行应用程序来查看实时应用程序购买收据的收据吗?
- json - Angular 未将 JSON 响应映射到嵌套接口