我可以通过GO中的方法扩展错误接口吗?

时间:2018-08-08 13:35:13

标签: go struct interface extension-methods

我已经使用C#多年了,所以我试图在GO中寻找相似之处(对此我很陌生)。

我的目标:
我想通过byte[]之类的方法扩展error接口,以便能够(由于我认为)可读性更好的代码而调用Check()

我的当前状态:
我已经学习了如何使用以下语法通过方法扩展类型:

error.Check()

我的问题:
看起来这仅适用于类型,而不适用于接口。到目前为止,我已经看到func (foo T) MyExtension() returnType { // return something } error,许多软件包都使用它们来描述其自身错误类型的基础。我不想扩展这种错误类型(从包中),而是想扩展接口以涵盖所有错误类型。我找不到任何语法。由于我也不知道该术语的技术性术语(不是interface),因此在谷歌搜索中有些失落。

那么有没有一种方法可以通过通用方法扩展extension-method接口?

2 个答案:

答案 0 :(得分:5)

您不能扩展error,它是内置接口类型。

您可以通过简单地添加新方法来扩展自己的接口类型。一开始这是“危险的”,因为在Go中实现接口是隐式的:没有意图的声明。这意味着,如果您有一个MyError接口,则某些现有类型可能已经实现了它并以此为基础。如果您向其中添加新方法,则现有类型很可能不再实现它,这很可能破坏现有代码(除非您添加该新方法的实现)。

从所需方法的名称(Check())来看,最好是创建一个实用函数:

func check(err error) {
    if err != nil {
        panic(err) // Do something
    }
}

此“模式”也可以与您自己的接口一起应用,不会干扰现有的实现。

答案 1 :(得分:0)

我强烈建议使用便装if语句进行错误检查。

someSpecificRBind(df1,df2, takeIntoAccount=df2)
#       col1 col2
# row_1    1    2
# row_2    10  99
# row_3    3    6

因为golang没有C#熟悉的try catch块。

如果您的方法Check()将返回bool-您仍然需要根据if语句对其进行检查。