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

我可以用GO中的方法扩展错误接口吗?,go,struct,interface,extension-methods,Go,Struct,Interface,Extension Methods,我与C#合作多年,因此我试图在GO中找到相似之处(我对这一点很陌生) 我的目标: 我想通过像Check()这样的方法扩展接口error,这样我就能够调用error.Check(),因为(在我看来)代码可读性更好 我的当前状态: 我已经学习了如何使用以下语法通过方法扩展类型: func (foo T) MyExtension() returnType { // return something } 我的问题: 看起来这只适用于类型,而不适用于接口。如我所见,error是一个接口,许多软件

我与C#合作多年,因此我试图在GO中找到相似之处(我对这一点很陌生)

我的目标:
我想通过像Check()这样的方法扩展接口
error
,这样我就能够调用
error.Check()
,因为(在我看来)代码可读性更好

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

func (foo T) MyExtension() returnType {
    // return something
}
我的问题:
看起来这只适用于类型,而不适用于接口。如我所见,
error
是一个
接口
,许多软件包都使用它来描述自己的错误类型。我不想(从包中)扩展这种错误类型,而是想扩展接口以涵盖所有错误类型。我找不到任何语法。由于我也不知道这方面的技术术语(它不是
扩展方法
),我在谷歌搜索时有点迷失了方向


那么有没有一种方法可以通过通用方法扩展
错误
接口?

您不能扩展
错误
,它是一种内置接口类型

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

根据所需方法的名称(
Check()
)判断,最好创建一个实用函数:

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

这种“模式”也可以应用于您自己的接口,它不会干扰现有的实现。

您不能扩展
错误,它是一种内置接口类型

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

根据所需方法的名称(
Check()
)判断,最好创建一个实用函数:

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

这种“模式”也可以应用于您自己的接口,它不会干扰现有的实现。

我强烈建议使用临时if语句进行错误检查

if err != nil {
    log.Printf("Error received - [%v]",err)
    return err
}
因为golang没有C#熟悉的try-catch块


如果您的方法Check()将返回bool,您仍然需要根据if语句检查它。

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

if err != nil {
    log.Printf("Error received - [%v]",err)
    return err
}
因为golang没有C#熟悉的try-catch块



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

您无法将方法动态添加到接口。如果这是可能的,以前实现接口的类型将在运行时中断。相反,您应该编写一个函数
func Check(error error)
。出于好奇:
Check()
方法有什么作用?@kostix在第一步中,只需将
错误
nil
进行比较,然后退出
log.fatal()
。以后我会计划如何最好地处理我的案例中的错误。一开始我只是想总结一下所有发生的错误。总结:这是一个坏主意,幸运的是它是可撤销的。你不能动态地向接口添加方法。如果这是可能的,以前实现接口的类型将在运行时中断。相反,您应该编写一个函数
func Check(error error)
。出于好奇:
Check()
方法有什么作用?@kostix在第一步中,只需将
错误
nil
进行比较,然后退出
log.fatal()
。以后我会计划如何最好地处理我的案例中的错误。一开始我只是想总结一下所有发生的错误。总结:这是一个坏主意,幸运的是它是可撤销的。我不会这么做。我会在
Check()
方法中测试
nil
的错误,然后返回或
log.fatal(…)
或类似。我肯定不会在我的代码中重复这个if语句。@C4u您不需要返回任何东西。检查错误就行了。我没有说返回
什么东西。我刚才说的
returning
,意思是让函数运行到底,即使没有返回对象,函数也会返回。另外:这个问题不应该是代码式的讨论。我非常喜欢编码。我只是需要一个关于扩展接口可能性的答案。其他一切对我来说都很清楚。但是谢谢你提供的信息,我不会这么做的。我会在
Check()
方法中测试
nil
的错误,然后返回或
log.fatal(…)
或类似。我肯定不会在我的代码中重复这个if语句。@C4u您不需要返回任何东西。检查错误就行了。我没有说返回
什么东西。我刚才说的
returning
,意思是让函数运行到底,即使没有返回对象,函数也会返回。另外:这个问题不应该是代码式的讨论。我非常喜欢编码。我只是需要一个关于扩展接口可能性的答案。其他一切对我来说都很清楚。但是谢谢你提供的信息。是的,我已经得到了效用函数。