我可以通过 GO 中的方法扩展错误接口吗?
Can I extend the error-interface by a method in GO?
我已经使用 C# 多年,所以我试图在 GO 中找到相似之处(我对此很陌生)。
我的目标:
我想通过 Check()
之类的方法扩展接口 error
所以我能够调用 error.Check()
只是因为(在我看来)更好的可读代码。
我现在的状态:
我已经学会了如何使用以下语法通过方法扩展类型:
func (foo T) MyExtension() returnType {
// return something
}
我的问题:
看起来这只适用于类型而不适用于接口。正如我目前所见,error
是一个 interface
,许多包使用它来描述它们自己的错误类型的基础。我不想扩展此错误类型(来自包),而是想扩展接口以涵盖所有错误类型。我找不到任何语法。因为我也不知道这个的技术术语(它不是 extension-method
)我在谷歌搜索中有点迷路了。
那么有没有办法通过通用的方法扩展error
接口呢?
你不能扩展error
,它是一个内置的接口类型。
您可以通过简单地添加新方法来扩展您自己的接口类型。这首先是 "dangerous",因为在 Go 中实现接口是隐式的:没有意图声明。这意味着如果你有一个 MyError
接口,一些现有的类型可能已经实现了它并以此为基础构建。如果您向其中添加新方法,现有类型很可能不再实现它,这很可能会破坏现有代码(除非您添加该新方法的实现)。
从您想要的方法的名称来看 (Check()
),最好是创建一个实用函数:
func check(err error) {
if err != nil {
panic(err) // Do something
}
}
这个"pattern"也可以应用在你自己的接口上,它不会干扰现有的实现。
我强烈建议使用随意的 if 语句进行错误检查。
if err != nil {
log.Printf("Error received - [%v]",err)
return err
}
因为golang没有C#熟悉的try catch块。
并且如果您的方法 Check() 将 return bool - 您仍然需要根据 if 语句检查它。
我已经使用 C# 多年,所以我试图在 GO 中找到相似之处(我对此很陌生)。
我的目标:
我想通过 Check()
之类的方法扩展接口 error
所以我能够调用 error.Check()
只是因为(在我看来)更好的可读代码。
我现在的状态:
我已经学会了如何使用以下语法通过方法扩展类型:
func (foo T) MyExtension() returnType {
// return something
}
我的问题:
看起来这只适用于类型而不适用于接口。正如我目前所见,error
是一个 interface
,许多包使用它来描述它们自己的错误类型的基础。我不想扩展此错误类型(来自包),而是想扩展接口以涵盖所有错误类型。我找不到任何语法。因为我也不知道这个的技术术语(它不是 extension-method
)我在谷歌搜索中有点迷路了。
那么有没有办法通过通用的方法扩展error
接口呢?
你不能扩展error
,它是一个内置的接口类型。
您可以通过简单地添加新方法来扩展您自己的接口类型。这首先是 "dangerous",因为在 Go 中实现接口是隐式的:没有意图声明。这意味着如果你有一个 MyError
接口,一些现有的类型可能已经实现了它并以此为基础构建。如果您向其中添加新方法,现有类型很可能不再实现它,这很可能会破坏现有代码(除非您添加该新方法的实现)。
从您想要的方法的名称来看 (Check()
),最好是创建一个实用函数:
func check(err error) {
if err != nil {
panic(err) // Do something
}
}
这个"pattern"也可以应用在你自己的接口上,它不会干扰现有的实现。
我强烈建议使用随意的 if 语句进行错误检查。
if err != nil {
log.Printf("Error received - [%v]",err)
return err
}
因为golang没有C#熟悉的try catch块。
并且如果您的方法 Check() 将 return bool - 您仍然需要根据 if 语句检查它。